2012-04-23 19 views
2

私はStockと呼ばれるクラスを持ち、価格の履歴セットである仮想ICollection Pricesを持っていると言います。Entity FrameworkレイジーローディングとICollection

在庫を取得して在庫がマテリアライズされた後、価格を照会してmystock.Prices.OrderByDescending(px => px.Date).First()のようなフィルターを適用すると、EFは内部的にすべての価格をロードし、価格は大規模なコレクションになる可能性があるので、私は本当にEFが私のwhereの条件に合った価格をロードするのを見たいと思っています。基本的には、クライアント側ではなくサーバー側でフィルタリングを適用します。

これは可能ですか?

おかげ

+0

それは遅延ロードでは不可能ですが、あなたがそれを行うことができます最初にエンティティをロードするとき(匿名の型に必要なデータを投影して) – BrokenGlass

答えて

2

ことは可能ですが、あなたはPricesが本当にEntityCollectionいうよりもICollectionを実装するために起こるいくつかの他のクラスであると仮定できる場合には、この方法はのみ動作します。サポートされているすべてのEFシナリオに該当するかどうかはわかりません。使用する関数はEntityCollectionCreateSourceQuery関数です。それはあなたのために動作しない場合は、別の可能性があるから戻ってコンテキストに移動して、クエリすることかもしれません

((EntityCollection<Price>)stock.Prices).CreateSourceQuery().OrderByDescending(price => price.Date).First(); 

(from price in context.Prices 
where price.StockId == stockId 
orderby price.Date descending 
select price).First(); 
+0

私の場合はHashSetです。CodeFirstを使用していますので、EntityCollectionを取得する方法を選択する必要はありません。 HashSet。パブリック仮想ICollection 価格{取得;セット; }したがって、EFはプロパティにアクセスするときに何らかの形でプロキシ経由でそれを埋めています。 – FabianVal

+0

@ user661486 POCOクラスを使用していて、クラスが変更トラッキングの要件を満たしていない(クラスは公開されており、開封されておらず、プロパティアクセサーは仮想である必要があります) )、またはプロキシクラスを無効にしました。さて、その場合、オプションの2番目の方がおそらく簡単な方法です。 – hvd

+0

クラスはpublicですが、accessorは仮想ですが、デフォルトでは無効にされていない限りプロキシクラスは残っていますが、無効にするために何もしませんでしたが、変数であるので、遅延読み込みです。 – FabianVal

関連する問題