3つのテーブルがあります。それらの2つは等しく参加しますが、1つは左から参加する必要があります。 linqでこれを行うためのコードをたくさん見つけていますが、2つのテーブルの間だけです。
これが、LINQ内で再コーディングしようとしているSQLコードです。
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コードのスニペットです。 LINQを介して、左外部結合を使用して3番目のテーブル(サンプルSQLの製品)をつなぎ合わせることができません。サンプルは2つのテーブルの間にあります。ヒントをありがとう。
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 };
マイケル
これはどう:
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 })
別の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クエリ構文とラムダ構文の組み合わせを使用して、何が(私が信じている)最良の結果になるかを示しています。識別子の大量の再エイリアスはありません。これは、これを実行するための最も簡潔な方法です。