web-dev-qa-db-ja.com

3つのテーブルを結合し、左外部結合を使用する

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

マイケル

19
MdeVera

これはどう:

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

別の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クエリ構文とラムダ構文の組み合わせを使用して、何が(私が信じている)最良の結果になるかを示しています。識別子の大量の再エイリアスはありません。これは、これを実行するための最も簡潔な方法です。

5
bwerks