Łączenie trzech tabel i korzystanie z lewego połączenia zewnętrznego

Mam trzy stoliki. Dwa z nich łączą się jednakowo, ale jeden będzie musiał połączyć się z lewej. Znajduję dużo kodu do tego w linq, ale tylko między dwoma tabelami.

Oto kod SQL, który próbuję ponownie zakodować w LINQ.

   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;

Oto fragment kodu LINQ, którego używam jako bazy. Po prostu nie jestem w stanie złożyć trzeciej tabeli (produkt w moim przykładowym SQL) przez LINQ i z lewym zewnętrznym łącznikiem. Próbka znajduje się pomiędzy dwoma tabelami. Dzięki za wszelkie napiwki.

   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

Author: BizApps, 2011-05-27

2 answers

A może tak:

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 })

EDIT: jeśli chcesz wykonać LEFT outer join na wszystkich tabelach, możesz to zrobić w następujący sposób:

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 })
 38
Author: Beno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-12 23:39:31

Wzięte z innego wątku Stackoverflow gdzieś, jest na to bardziej czytelny sposób:

   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 })

To wykorzystuje mieszankę składni zapytań linq i składni lambda do tego, co (moim zdaniem) jest najlepszym wynikiem. Nie ma obfitego ponownego aliasowania identyfikatorów i jest to najbardziej zwięzły sposób na to, jaki widziałem.

 5
Author: bwerks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 19:22:57