2011-07-05 5 views
2

私はいつもEFキャッシュのクエリ結果がデータベース上で同じクエリを2回実行するのではなく、内部キャッシュからエンティティの一覧を返すと仮定しました。同じクエリを2回実行すると、Entity Framework 4がデータベースに戻る

var cipEntities = new CIPEntities(); // instantiate objectcontext 
Console.WriteLine(cipEntities.Customers.ToList()); // fires db query 
Console.WriteLine(cipEntities.Customers.ToList()); // also fires db query 

私は誤った仮定をしていますか?私はRIAサービスに関する私の経験によって混乱しているかもしれません。おそらくRIAサービスは結果をキャッシュし、EFはそうではありませんか?

var results = cipEntities.Customers.ToList(); 
Console.WriteLine(results); 
Console.WriteLine(results); 

答えて

2

はい、間違っています。 EFには第2レベルのキャッシュ(キャッシングクエリ)がないため、クエリを実行すると、同じコンテキストで既に実行されているクエリであることがわかりません。 EFクエリの主なルールは、結果がコンテキストによって既に追跡されていても実行されます(コンテキストから抽出できます)。

解決策は、@Robotsushiに記載されているキャッシングプロバイダです。

1

これはEFと標準的な動作ですが、これを回避する簡単な方法は、ローカル変数にあなたの結果をキャッシュし、代わりにこれを使用することですオブジェクトを静的リストに入れ、データベースに戻らずに好きなだけクエリを実行します。あなたがチェックアウトすることができキャッシング微調整したい場合は

は:Tracing and Caching Providers

あなたががidで照会するつもりなら、あなたはObjectContext.GetObjectByKeyメソッドを使用することができ、それは前にオブジェクト・キャッシュで検索しますdbに照会します。

+0

@Chad:そのため、彼は結果をローカルリストに保存しています。 –

+0

@Chad - あなたはここでポイントを逃したと思う。 'ToList()'をもう一度呼び出す必要がないように、ローカルリストにキャッシュします(クエリの 'ToList()'への呼び出しを参照)。 – James

3

あなたはの結果のリストを格納することができます

おかげ

0

事前に列挙したクラス(つまり.ToList())としてキャストすることを選択しない限り、EFは列挙しようとするたびにクエリを実行します。実際には、列挙されたコレクションを使用してキャストしない限り、ストアドプロシージャの結果として複雑なクラスを使用すると、エラーがスローされます。

関連する問題