2009-06-12 9 views
3

私は必要なエンティティツリーのロードに、より構造的なアプローチを作成したいと思います:イーガーロード集計根

私はデータの深刻な量を必要とするので、私はこの使用してタイプセーフが含まやっています(ちょうど普通のインクルードだがラムダのもの)as shown here

私が言ったように、私は多くのデータ、基本的に1親項目の下に全体のエンティティツリーが必要です。あなたが見ることができるように、含まれるで満たされ、このラインは非常に巨大な得ることができます

context.House 
    .Include(x => x.Doors) 
    .Include(x => x.Doors.FirstOrDefault().Joint) 
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory) 
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory.JointType) 
    .Include(x => x.Windows) 
    // ... same thing 
    .Include(x => x.Roof) 
    // ... same thing 

さて、私のようなこのやって何かをすることができます。これは実際には実際のコード(ハウスbtwは含まれていません)の非常に単純化されたサンプルです

私がしたいのは、ツリー内のブランチを担当するメソッドを作成することです。メソッドがオブジェクトクエリを受け入れて子をインクルードすることができ、その順番で "子ローダーメソッド"を呼び出すことができます。また、親が子供のタイプの財産を持つ限り、親は問題ではありません。

public void LoadHouse(int id) 
{ 
    // ... 
    ObjectQuery<House> query = context.House; 

    // and now? 
    LoadDoors(query, x => x.Door); 

} 

public void LoadDoors<T>(ObjectQuery<T> query, ..?..) 
{ 
    // ... ? 

    LoadJoints(...) 


} 

などなど:

これはおそらく、それほど意味がありません。しかし、私は本当にそれの周りに私の頭を得ることはできません...受信クエリと子メソッドを呼び出す間にリンクがありません。

誰もこのようなことをしましたか?あるいは、誰かが私にいくつかの指針を与えることができますか?

クエリ= LoadDoors(クエリ、X => x.Door);:

答えて

2

この代わりのようなものを試してみてください

ここで、LoadXはIncludeを呼び出した結果を返します。

+0

私は式をLoadDoorsメソッドに渡す必要はないと思いますが、確かにLoadDoorsメソッドはその式を知っていますか? –

+1

私はまた、void to returnクエリを変更することがこれに対する解決策であるとは見ていません。 Afterallでは、クエリは、byrefで来るので、私がそのメソッドで行うことは何でも行われます。 – Bertvan

+0

@Bertvan ReferenceEquals(q、q.Include( "Foo"))== false –