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)
私は左の外側にはそれがクエリの意図を無効に参加することを排除するためのコードで何を変更できますか?
私が理解しているように、 "joined"は結合された子と一緒に親オブジェクトです。 Where()を介してフィルタリングした後のAll()への最初の呼び出しの結果です。だからこそ私が加わったのだ。チャイルド何でも。インテリセンスは同意します。 GrandChildプロパティではなくParentプロパティを持ちます。 – dudeNumber4
私は最終結果が最後の結合の結果ではなく、親オブジェクトであると考えていました。私は参加していました。子供は親子に行くと思っていましたが、そのプロパティは実際には逆でした:孫 - >子供。修正は、(c、g)=> gから(c、g)=> cに変更して、孫でない子を返すことでした。 – dudeNumber4