0

クエリ結果に、処理されたデータの一部のみが含まれるようにします。たとえば、エンティティ Sale と Item があり、各 Sale には特定の Sale の Item のリストである Items プロパティがあるとします。

from s in myContext.Sales
select s;

すべてのアイテムを含む各セールですべてのセールスを返します(LazyLoadingがデフォルトでオンになっているため、アイテムに移動すると)。しかし、各セールに特定のアイテムのみを含めたいと考えています。たとえば、Name == "Orange" のアイテムを指定しても、すべてのセールが必要です。これどうやってするの?

4

2 に答える 2

4

遅延読み込みがオンの場合、実際には、参照するものを遅延読み込みします。有効にしたくない場合は、オフにします。

myContext.Configuration.LazyLoadingEnabled = false;

遅延ロードが不要になるように、最初のデータベース ラウンドトリップで特定のものをロードするように指定できます。そこで、インクルードはあなたの友達です。

using System.Data.Entity; // You need this to get the lambda version of Include

from s in myContext.Sales.Include(s => s.PropertyA).Include(s => s.PropertyB)
select s;

仮想を宣言しないことで、特定のプロパティの遅延読み込みをいつでも無効にできることに注意してください。

素晴らしい概要については、次のブログをお勧めします

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

于 2012-08-09T04:03:49.663 に答える
0

私の答えはEF 4.0に固有のもので、ほとんどがここから得られました:http://msdn.microsoft.com/en-us/library/bb896249.aspx

ナビゲーション プロパティにアクセスしたときに LazyLoading がすべてをロードするのを防ぎます。

myContext.Configuration.LazyLoadingEnabled = false;

アイテムをロード:

List<Sale> sales = (from s in myContext.Sales
                    select s).ToList()

Foreach アイテム 必要な関連アイテムをアタッチします (一部のアイテムのみを取得するための鍵は CreateSourceQuery() メソッドです)。

foreach(Sale s in sales)
    s.Items.Attach(s.Items.CreateSourceQuery().Where(i => i.Name == "Orange"));
于 2012-08-09T07:08:57.817 に答える