LINQ to SQL'deki bir iç birleşimin sözdizimi nedir?


443

LINQ to SQL deyimi yazıyorum ve ONC # bir cümle ile normal bir iç birleşim için standart sözdizimi sonra duyuyorum .

LINQ to SQL'de aşağıdakileri nasıl temsil ediyorsunuz:

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID

Tablolar arasında yabancı bir anahtar varsa, aşağıdaki Kirk Broadhurst'un cevabına bakmalısınız.
Guilherme

1
Tablo adlarınızı çoğullaştırmalısınız. Bir tablo tutma (yaklaşık kayıt) birçok bayi çağrılmalıdır satıcılarını satıcı, değil.
ANeves

5
@ANeves Çoğul tablo isimlerini kullanmak standart uygulamadan çok uzaktır, hem tekil hem de çoğul mükemmel kabul edilebilir - nesne adlarını eşleştirmek için kendimden çoğuldan tekil olana geçtim - burada en iyi cevap tekil kabul ediyor (birçok çoğullama garip ya da olmayan var - örneğin '1 koyun, 8 koyun': stackoverflow.com/questions/338156/…
niico

@niico bu tartışmak için bir yer değil, sanırım ... ama Microsoft Entity Framework tablo adlarını çoğaltır , Ruby on Rails 'ORM tabloları çoğaltır ... sizin için standart uygulamaya yeterince yakın mı? :) Karşı argüman: NHibernate tabloları çoğullaştırmıyor gibi görünüyor .
ANeves

2
Gerçekten - bazı insanlar bunu bir şekilde yapar - bazıları bunu başka bir şekilde yapar. Standart bir uygulama yoktur. Şahsen tekil olanın çok daha fazla faydası olduğunu düşünüyorum.
niico

Yanıtlar:


572

Gibi bir şey gider:

from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}

Daha iyi bir örnek için tablolarınız için anlamlı adlara ve alanlara sahip olmak güzel olurdu. :)

Güncelleme

Sorgunuz için bu daha uygun olabilir düşünüyorum:

var dealercontacts = from contact in DealerContact
                     join dealer in Dealer on contact.DealerId equals dealer.ID
                     select contact;

Kişileri aradığınızdan, satıcıları değil.


11
teşekkür ederim, bundan sonra mantıklı isimlerifrom c or from t1
linq'de

231

Ve ifade zinciri sözdizimini tercih ettiğim için, bunu nasıl yapacağınız aşağıda açıklanmıştır:

var dealerContracts = DealerContact.Join(Dealer, 
                                 contact => contact.DealerId,
                                 dealer => dealer.DealerId,
                                 (contact, dealer) => contact);

8
Yalnızca iki tablodan birinin (bu yanıt örneğindeki DealerContact tablosu) yerine, her iki tablodaki alanları filtrelemeniz veya seçmeniz gerekiyorsa , işte size bir örnek: stackoverflow.com/a/29310640/12484
Jon Schneider

52

Clever Human'ın ifade zinciri sözdizimi yanıtını genişletmek için :

Her iki tablonun birleştirildiği alanlarda (filtre veya seçme gibi) bir şeyler yapmak istiyorsanız - bunun yerine bu iki tablodan sadece birinde - Join yönteminin son parametresinin lambda ifadesinde yeni bir nesne oluşturabilirsiniz bu tabloların her ikisini de içeren, örneğin:

var dealerInfo = DealerContact.Join(Dealer, 
                              dc => dc.DealerId,
                              d => d.DealerId,
                              (dc, d) => new { DealerContact = dc, Dealer = d })
                          .Where(dc_d => dc_d.Dealer.FirstName == "Glenn" 
                              && dc_d.DealerContact.City == "Chicago")
                          .Select(dc_d => new {
                              dc_d.Dealer.DealerID,
                              dc_d.Dealer.FirstName,
                              dc_d.Dealer.LastName,
                              dc_d.DealerContact.City,
                              dc_d.DealerContact.State });

İlginç olan kısım, bu örneğin 4. satırındaki lambda ifadesidir:

(dc, d) => new { DealerContact = dc, Dealer = d }

... burada tüm alanlarıyla birlikte DealerContact ve Dealer kayıtlarının özelliklerine sahip yeni bir anonim tip nesne inşa ediyoruz.

Daha sonra, örneklerin geri kalanında gösterildiği dc_dgibi, hem DealerContact hem de Dealer kayıtlarını özellikleri olarak oluşturduğumuz anonim nesne için bir ad olarak kullanan sonuçları filtreler ve seçerken bu kayıtlardaki alanları kullanabiliriz .


9
Lambda'lı birleşimler korkunç sözdizimine sahiptir. Bunu kullanmayı reddediyorum ;-)
Mariusz

12
@aristo Seni hiç suçlamıyorum. Sözdizimini kendime hatırlatmak için genellikle bu gönderiye başvurmam gerekir!
Jon Schneider

2
Benim gibi bazı insanlar tutarlılığı tercih ediyor. Bu yüzden özellikle lambda sözdizimini arıyorum.
0014

43
var results = from c in db.Companies
              join cn in db.Countries on c.CountryID equals cn.ID
              join ct in db.Cities on c.CityID equals ct.ID
              join sect in db.Sectors on c.SectorID equals sect.ID
              where (c.CountryID == cn.ID) && (c.CityID == ct.ID) && (c.SectorID == company.SectorID) && (company.SectorID == sect.ID)
              select new { country = cn.Name, city = ct.Name, c.ID, c.Name, c.Address1, c.Address2, c.Address3, c.CountryID, c.CityID, c.Region, c.PostCode, c.Telephone, c.Website, c.SectorID, Status = (ContactStatus)c.StatusID, sector = sect.Name };


return results.ToList();

1
Merhaba, lütfen bana bu kısmın ne hakkında olduğunu söyleyebilir misin? Durum = (ContactStatus) c.StatusID Özellikle fragmanla ilgileniyorum: (ContactStatus) c.StatusID Saygılarımızla Mariusz
Mariusz

1
@aristo - koda baktığımda, bunun ContactStatusgerçekten bir numaralandırma olduğunu ve c.StatusIDgerçekten bir kimlik değil, numaralandırmanın sayısal değerini tahmin ediyorum . Eğer haklıysam, (ContactStatus)c.StatusIDgerçekten bir enum'a bir tamsayı atıyor.
Joel Mueller

25

Linq Join operatörünü kullanın :

var q =  from d in Dealer
         join dc in DealerConact on d.DealerID equals dc.DealerID
         select dc;

1
her iki d & dc sütunları istediğimde ne yapmalı?
Kuntady Nithesh

1
@KuntadyNithesh Sonra yeni MyCustomer'ı seçmek gibi oluşturduğunuz bir sınıfı döndürün {Id = dc.id, Id2 = d.id} İşte bu!
Elisabeth

25

Yabancı bir anahtar oluşturursunuz ve LINQ-to-SQL sizin için gezinme özellikleri oluşturur. Her birinde , seçebileceğiniz, filtreleyebileceğiniz ve yönetebileceğiniz Dealerbir koleksiyon olacaktır DealerContacts.

from contact in dealer.DealerContacts select contact

veya

context.Dealers.Select(d => d.DealerContacts)

Gezinme özelliklerini kullanmıyorsanız, nesne grafiğini eşleyen kısım olan LINQ-to-SQL'in ana avantajlarından birini kaçırırsınız.


Ah adamım, zamanımı kurtardın, artık bu aptalca birleştirmelerle uğraşmak zorunda değilim!
Tomas

23

temelde LINQ birleştirme operatörü SQL için hiçbir fayda sağlamaz. Yani aşağıdaki sorgu

var r = from dealer in db.Dealers
   from contact in db.DealerContact
   where dealer.DealerID == contact.DealerID
   select dealerContact;

SQL'de INNER JOIN ile sonuçlanacak

join daha verimli olduğu için IEnumerable <> için kullanışlıdır:

from contact in db.DealerContact  

fıkra her bayi için yeniden icra edilecekti ancak IQueryable <> için durum böyle değil. Ayrıca katılmak daha az esnektir.


12

Aslında, çoğu zaman linq'e katılmamak daha iyidir. Gezinme özellikleri olduğunda, linq ifadenizi yazmanın çok kısa bir yolu:

from dealer in db.Dealers
from contact in dealer.DealerContacts
select new { whatever you need from dealer or contact }

Nerede bir cümle anlamına gelir:

SELECT <columns>
FROM Dealer, DealerContact
WHERE Dealer.DealerID = DealerContact.DealerID

Birden çok "from" yan tümcesi içeren bir LINQ sorgusu (bu örnekte olduğu gibi) ifade zinciri sözdiziminde neye benziyor? Mümkün mü?
Jon Schneider

1
Yöntemi sözdizimi eşdeğeridir SelectMany().
Gert Arnold

3

İç Birleştirme işlemini gerçekleştirmek için LINQ birleşimlerini kullanın .

var employeeInfo = from emp in db.Employees
                   join dept in db.Departments
                   on emp.Eid equals dept.Eid 
                   select new
                   {
                    emp.Ename,
                    dept.Dname,
                    emp.Elocation
                   };

3

Bunu dene :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 

3
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID orderby od.OrderID select new { od.OrderID,
 pd.ProductID,
 pd.Name,
 pd.UnitPrice,
 od.Quantity,
 od.Price,
 }).ToList(); 

Stack Overflow'a hoş geldiniz! Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen hem kodun hem de açıklamaların okunabilirliğini azalttığı için kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın!
Hoşçakal StackExchange

2
OperationDataContext odDataContext = new OperationDataContext();    
        var studentInfo = from student in odDataContext.STUDENTs
                          join course in odDataContext.COURSEs
                          on student.course_id equals course.course_id
                          select new { student.student_name, student.student_city, course.course_name, course.course_desc };

Öğrenci ve ders tablolarının birincil anahtar ve yabancı anahtar ilişkisinin olduğu yerler


2

bunun yerine bunu deneyin,

var dealer = from d in Dealer
             join dc in DealerContact on d.DealerID equals dc.DealerID
             select d;

1
var Data= (from dealer in Dealer join dealercontact in DealerContact on dealer.ID equals dealercontact.DealerID
select new{
dealer.Id,
dealercontact.ContactName

}).ToList();

1
var data=(from t in db.your tableName(t1) 
          join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname
          (where condtion)).tolist();

1
var list = (from u in db.Users join c in db.Customers on u.CustomerId equals c.CustomerId where u.Username == username
   select new {u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic}).First();

İstediğiniz tablo adlarını yazın ve alanların sonucunu almak için seçimi başlatın.


var list = (db.Yourfirsttablename, u.firsttablecommonfields üzerindeki db.secondtablename içinde c'den katılın. u.Username == kullanıcı adının yeni {u.UserId, u.CustomerId, u.ClientId, u.RoleId öğesini seçtiği c.secondtablecommon alanına eşittir. , kullanıcı adı, u.Email, u.Parola, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Kilit, u.Active, c.ProfilePic}). First ();
Sarfraj Sutar

1

İç birleşim iki tablo linq C #

var result = from q1 in table1
             join q2 in table2
             on q1.Customer_Id equals q2.Customer_Id
             select new { q1.Name, q1.Mobile, q2.Purchase, q2.Dates }

1

DealerContrac'daki d1'den d1.dealearid'deki DealerContrac'daki d2'ye d2.dealerid eşittir yeni {dealercontract *} seçin


Stack Overflow'a hoş geldiniz! Bu cevap, mevcut yanıtlara hiçbir şey eklemez.
Jeroen Heier

-6

En İyi Bir Örnek

Tablo İsimleri: TBL_EmpveTBL_Dep

var result = from emp in TBL_Emp join dep in TBL_Dep on emp.id=dep.id
select new
{
 emp.Name;
 emp.Address
 dep.Department_Name
}


foreach(char item in result)
 { // to do}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.