2016-07-18 1 views
0

私はラムダをかなり新しくしています。私はdbから製品を引き出し、著者のテーブルに参加する結合を作成しようとしています。しかし、私のdbの一部の製品には、製品パッケージなどの作者がいません。このため、クエリはそれらのレコードを取得しません。テーブルに参加するときにLinq Lambda joinが中断する

linqラムダで作成者を所有している、所有していないすべての製品のレコードを取得する方法はありますか?内側の結合または右側の結合と同様?ここに私のdb /クエリ:

DATABASE

製品

+-----------------------------------------+--------+----+---------+ 
|    FullName     | TypeId | Id | Sku | 
+-----------------------------------------+--------+----+---------+ 
| The Matrix        |  1 | 23 | MAT  | 
| Lord Of The Rings      |  1 | 22 | LOTR | 
| Package: Lord of the rings & The Matrix |  2 | 33 | LOTRMAT | 
+-----------------------------------------+--------+----+---------+ 

AuthorAssignments

+--------+----+----------+ 
| TypeId | Id | AuthorId | 
+--------+----+----------+ 
|  1 | 23 |  1 | 
|  1 | 22 |  2 | 
+--------+----+----------+ 

著者

+----------+------------------+ 
| AuthorId |  Author  | 
+----------+------------------+ 
|  1 | The Wachowskis | 
|  2 | J. R. R. Tolkien | 
+----------+------------------+ 

QUERY

 var allitems = _contentService.Products.Select(
      x => new {x.FullName, x.TypeId, x.Id, x.Sku}) 
      .Join(
       _contentService.AuthorAssignments, 
       x => new {x.TypeId, x.Id}, 
       y => new {y.TypeId, y.Id}, 
       (x, y) => 
        new 
        { 
         x.Sku, 
         x.FullName, 
         x.Id, 
         x.TypeId, 
         y.AuthorId 
        }) 
      .Join(
       _contentService.Authors, 
       authId => authId.AuthorId , 
       auth => auth.Id, 
       (authId, auth) => 
        new 
        { 
         authId.Sku, 
         authId.FullName, 
         authId.Id, 
         authId.TypeId, 
         authId.Image, 
         auth.Author 
        }); 

これは私にこのような結果与える:これは私が

+-----------------------------------------+----------+----+---------+------------------+ 
|    FullName     | TypeId | Id | Sku |  Author  | 
+-----------------------------------------+----------+----+---------+------------------+ 
| The Matrix        |  1 | 23 | MAT  | The Wachowskis | 
| Lord Of The Rings      |  1 | 22 | LOTR | J. R. R. Tolkien | 
| Package: Lord of the rings & The Matrix |  2 | 33 | LOTRMAT | null    | 
+-----------------------------------------+----------+----+---------+------------------+ 

のように見えるを達成しようとしているものです時に

+-------------------+--------+----+------+------------------+ 
|  FullName  | TypeId | Id | Sku |  Author  | 
+-------------------+--------+----+------+------------------+ 
| The Matrix  |  1 | 23 | MAT | The Wachowskis | 
| Lord Of The Rings |  1 | 22 | LOTR | J. R. R. Tolkien | 
+-------------------+--------+----+------+------------------+ 

をそのsinc eパッケージには、それを無視した1つの著者レコードが含まれていません。どんな助けでも大歓迎です。

UPDATE

申し訳ありませんが、私はNHibernateはを使用していますことを言及するのを忘れてしまいました。したがってgroupjoinsが実装されていません:(

+0

あなたは間違いなく左外部結合必要がありますが、率直に言って、それはですクエリ構文を使用した場合、変更は簡単ではありません。 –

+0

問題は、動作中のクエリを使用するか、メソッド構文を使用するか(whaあなたはラムダと呼ぶ)? –

+0

ええ、私はラムダ式でのみ滞在したいと思います。 – NeoSketo

答えて

1

ここラムダ式メソッドの構文でクエリです:

var allitems = _contentService.Products 
    .Select(x => new {x.FullName, x.TypeId, x.Id, x.Sku}) 
    .GroupJoin(_contentService.AuthorAssignments, 
     p => p.Id, 
     aa => aa.Id, 
     (p, aa) => new 
     { 
      p.Sku, 
      p.FullName, 
      p.Id, 
      p.TypeId, 
      AuthorId = aa.Select(x => x.AuthorId).FirstOrDefault() 
     }) 
    .GroupJoin(_contentService.Authors, 
     p => p.AuthorId, 
     a => a.Id, 
     (p, a) => new 
     { 
      p.FullName, 
      p.TypeId, 
      p.Id, 
      p.Sku, 
      Author = a.Select(x => x.Author).FirstOrDefault() 
     }); 

出力:

+--------------------------------+--------+----+---------+------------------+ 
|   FULLNAME   | TYPEID | ID | SKU |  AUTHOR  | 
+--------------------------------+--------+----+---------+------------------+ 
|        |  | |   |     | 
| The Matrix      | 1  | 23 | MAT  | The Wachowskis | 
|        |  | |   |     | 
| Lord Of The Rings    | 1  | 22 | LOTR | J. R. R. Tolkien | 
|        |  | |   |     | 
| Package: Lord of the rings & T | 2  | 33 | LOTRMAT | null    | 
| he Matrix      |  | |   |     | 
+--------------------------------+--------+----+---------+------------------+ 
関連する問題