Соединение трех таблиц и использование левого внешнего соединения - PullRequest
16 голосов
/ 27 мая 2011

У меня есть три таблицы.Два из них присоединяются одинаково, но одному нужно присоединиться с левой стороны.Я нахожу много кода для этого в 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 ]

42 голосов
/ 27 мая 2011

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

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

РЕДАКТИРОВАТЬ: если вы хотите выполнить левое внешнее объединение для всех таблиц, вы можете сделать это следующим образом:

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 })
5 голосов
/ 22 сентября 2016

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

...