2011-05-26 33 views
14

Üç tablom var. İki tanesi eşit olarak katılıyor ama bir tanesi bir sol ile birleşmeye ihtiyaç duyacak. Bunu linq'de ancak sadece iki tablo arasında yapmak için çok fazla kod buluyorum.Üç tabloyu birleştirmek ve sol dış birleştirme kullanmak

LINQ içinde yeniden kodlamaya çalıştığım SQL kodu İşte.

SELECT PRSN.NAME 
     ,CO.NAME 
     ,PROD.NAME 
    FROM PERSON PRSN 
    INNER JOIN COMPANY CO ON PRSN.PERSON_ID = CO.PERSON_ID 
    LEFT OUTER JOIN PRODUCT PROD ON PROD.PERSON_ID = PROD.PERSON_ID; 

Temel olarak kullandığım LINQ kodunun bir pasajı. Üçüncü tabloyu (örnek SQL'imde bulunan ürün) LINQ ile ve sol dış birleştirme ile bir araya getiremiyorum. Örnek iki tablo arasındadır. Her ipucu için teşekkürler.

var leftOuterJoinQuery = 
    from category in categories 
    join prod in products on category.ID equals prod.CategoryID into prodGroup 
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0}) 
     select new { CatName = category.Name, ProdName = item.Name }; 

Michael

cevap

34

nasıl bu konuda:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = x.NAME }) 

DÜZENLEME: Bir sol dış yaptığımız tüm tabloları katılmak istiyorsanız, bunu şöyle yapabilirsiniz:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID into comps 
      from y in comps.DefaultIfEmpty() 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = y.NAME, Product = x.NAME }) 
+0

... çok teşekkür ederim! Bu benim için çalışıyor. – MdeVera

+1

endişelenme, dostum. Son zamanlarda aynı problemi yaşadım ... anlamaya biraz zaman ayırdım. paylaşmaktan mutluluk duyuyoruz :) – Beno

+0

@Beno Her masanın üzerinde bir dış ve bir dış birleşim yerine sol dış birleştirmeyi kullanmak istiyorsanız ne yaparsınız? – mko

5

Başka bir Stackoverflow iş parçacığı bir yerden alınmış, bunu yapmak için daha okunaklı bir yol var:

var loj = (from prsn in db.People 
      from co in db.Companies.Where(co => co.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      from prod in db.Products.Where(prod => prod.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = prod.NAME }) 

Bu, linq sorgu sözdizimi ve lambda sözdizimi karışımından en iyi sonucun ne olduğuna inanıyorum. Tanımlayıcıların bol bir şekilde yeniden hizalanması yok ve bunu gördüğüm en özlü yol.

İlgili konular