Соединение трех таблиц и использование левого внешнего соединения
у меня есть три таблицы. Два из них объединяются поровну, но одному нужно будет объединиться с левым. Я нахожу много кода для этого в 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 и лямбда-синтаксиса для того, что (я считаю) лучший результат. Нет обильного повторного сглаживания идентификаторов, и это самый краткий способ сделать это, который я видел.