Соединение трех таблиц и использование левого внешнего соединения

у меня есть три таблицы. Два из них объединяются поровну, но одному нужно будет объединиться с левым. Я нахожу много кода для этого в linq, но только между двумя таблицами.

вот код SQL, который я пытаюсь перекодировать в 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;

вот фрагмент кода LINQ, который я использую в качестве базы. Я просто не могу собрать третью таблицу (продукт в моем примере SQL) через LINQ и с левым внешним соединением. Образец находится между двумя таблицами. Спасибо за любые советы.

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

Михаил

2 ответов


Как насчет этого:

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: если вы хотите сделать левое внешнее соединение на всех таблицах, вы можете сделать это следующим образом:

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

взятый из другого потока Stackoverflow где-то, есть более разборчивый способ сделать это:

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

Это использует сочетание синтаксиса запроса linq и лямбда-синтаксиса для того, что (я считаю) лучший результат. Нет обильного повторного сглаживания идентификаторов, и это самый краткий способ сделать это, который я видел.