2011-01-03 1 views
6

私は現在、EF4データリポジトリで拡張メソッドを使用することに限定されています。私はlinqをEFに使用することはできません。私は単純な3テーブルの結合作業をしようとしています。ここでは、コードは次のようになります。ここではこのEF Joinメソッド呼び出しで何が問題になっていますか?

var query = _readOnlyRepository.All<Parent>() 
      .Where(p => p.Something == "something") 
      .Join(_readOnlyRepository.All<Child>(), // Child entity 
       p => p.ParentID,      // Parent Key 
       c => c.ChildId,      // Child Key 
       (p, c) => c)      // Projection 
      .Join(_readOnlyRepository.All<GrandChild>(), 
       c => m.ChildID, 
       g => g.GrandChildID, 
       (c, g) => g) 
      .Select(joined => joined.Child.Whatever); 

は(基本的に)生成されたSQLです:

select c2.Whatever 
from Parent p 
inner join Child c on p.ParentId = c.ParentId 
inner join GrandChild g on c.ChildId = g.ChildId 
left outer join Child c2 on g.ChildId = c2.ChildId 
where ("something" = p.Something) 

私は左の外側にはそれがクエリの意図を無効に参加することを排除するためのコードで何を変更できますか?

答えて

2

あなたが返そうとしているもの、つまりGrandChildのWhateverプロパティを明確にしていませんか?あなたの第二の参加戻り孫オブジェクト(c, g) => gは、私はここにjoinedが孫オブジェクトであるので、あなただけの

.Select(joined => joined.Whatever); 

が必要と思います。

+0

私が理解しているように、 "joined"は結合された子と一緒に親オブジェクトです。 Where()を介してフィルタリングした後のAll()への最初の呼び出しの結果です。だからこそ私が加わったのだ。チャイルド何でも。インテリセンスは同意します。 GrandChildプロパティではなくParentプロパティを持ちます。 – dudeNumber4

+0

私は最終結果が最後の結合の結果ではなく、親オブジェクトであると考えていました。私は参加していました。子供は親子に行くと思っていましたが、そのプロパティは実際には逆でした:孫 - >子供。修正は、(c、g)=> gから(c、g)=> cに変更して、孫でない子を返すことでした。 – dudeNumber4

関連する問題