2010-11-30 2 views
9

単純なナビゲーションプロパティBのエンティティAがあります。 Aの任意のインスタンスに対して、Bの関連する数千のインスタンスが予想されます。 、私はそのようなEFはEntityCollectionを構築しますが、IQueryableが必要です。

私の知る限り
var statY = A.B.Where(o => o.Property == "Y"); 
var statZ = A.B.Where(o => o.CreateDate > DateTime.Now.AddDays(-1)); 

などの集計操作を行うことでのみ興味が、その代わり

foreach(var x in A.B) { ... } 

は、私のようなものを呼び出す何の場合はありませんEFは数千のBへの参照をインスタンス化し、これらの演算をメモリ内で行います。これは、ナビゲーションプロパティがEntityCollectionを使用するためです。代わりに、可能であればSQLレベルでこれらのクエリを実行したいと思います。

現在のところ、ナビゲーションプロパティは適切な方法ではない可能性があります。私はEFには付いていないので、私は他のアプローチにもオープンです。しかし、私は可能ならばEFのもとでこれを行う正しい方法を知ることに非常に興味があります。

(私はEF4を使用しています)

答えて

12

CreateSourceQueryは、トリックを行うようです。

だから私の例は今のようになります。

var statY = A.B.CreateSourceQuery().Where(o => o.Property == "Y"); 
var statZ = A.B.CreateSourceQuery().Where(o => o.CreateDate > DateTime.Now.AddDays(-1)); 
+0

A.Where(a => a.B.CreateSourceQuery()。Any(o => o.Property == "Y")); か、ここではlinq JOINをお勧めしますか? –

-1

知っておくべきことが1つあります。 IQueryable <から派生したメンバーは、メモリ上ではなくサーバー上で実行されます。 IEnumerable <>から派生したメンバーはメモリ内で実行されます。例

var someEntities = db.SomeEntities; <-- returns an IQueryable<> object. no data fetched. SomeEntities table may contain thousands of rows, but we are not fetching it yet, we are just building a query. 
someEntities = someEntities.Where(s => s.Id > 100 && s.Id < 200); <-- creates expression tree with where statement. The query is not executed yet and data is not fetched on the client. We just tell EF to perform a where filter when query will execute. This statement too returns an IQueryable<> object. 
var entities = someEntities.AsEnumerable(); <-- here we tell EF to execute query. now entities will be fetched and any additional linq query will be performed in memory. 

ため あなたもてToArray()またはToListメソッド<>を呼び出して、foreachのを使用してデータをフェッチすることができます。

あなたは私が何を意味するか理解してほしい、と私の英語のため申し訳ありません:)

+0

はい、私はすべてのことを理解しています。しかし、問題はナビゲーションプロパティがEntityCollectionsであり、IQueryableを実装していないことです。 – Larsenal

+0

この答えは質問には関係ありません..質問はエンティティによって公開されたNavigationPropertiesの 'EntityCollection'について質問し、答えは' ObjectContext'によって公開される 'ObjectSet'の操作方法を説明することに焦点を当てます。単純化すると、OPはバックパックに何かを見つける方法を尋ね、答えは車のトランクにあるバックパックを見つける方法を示します。 – quetzalcoatl

関連する問題