2012-01-26 25 views
0

はのは、私は3つのテーブルを持っているとしましょう。Entity Frameworkの生成不必要なクエリ

のは、(すぐにデータのクエリ実行/列挙を強制的に)私はいくつかのメソッドを呼び出し、そのメソッドの内部で、我々は次のコードを実行することを想定してみましょう:

var categories = context.Categories.ToList(); 
var items = context.Items.ToList(); 
var links = context.CategoriesToItems.ToList(); 

この直後、私はそれぞれの製品を検討開始ように:

foreach(Category category in categories) 
{ 
    foreach(Item item in links.Select(l => l.Item)) 
    { 
     //Do some stuff. 
    } 
} 

これらのforeachループはなぜデータベースへのクエリを生成するのですか?カテゴリ、アイテム、およびリンクテーブルのエントリをロードしたため、EFは必要な情報をすべて知っていないはずですか?

興味深いことに、私は少し物事を変更し、私は製品がどのカテゴリにあるかを知りたいときに

var items = context.Items.ToList(); 
var categories = context.Categories.Include("CategoriesToItems").ToList(); 

クエリを生成しない同様のループを実行するようにデータをロードする場合。

私が気にする理由は、データを最初にロードする方がはるかに高速ですが、データの操作をすぐに実行しなければならず、そのパフォーマンスはずっと遅くなります(各パスで生成される追加のクエリのため) 。

いくつかの異なるテーブルのデータが必要なので、実際のインクルード句は複雑です。なぜなら、精巧に生成された複数の結合クエリを使用してテーブル全体をロードするよりも、テーブル全体を読み込む方が速いからです。その中にあるデータ)。実際のアプリケーションにはもっと多くのテーブルが含まれています(カテゴリにはタグがあり、アイテムにはタグがあり、両方の関係には多対多があります)。アイテム/カテゴリの辞書をタグに付け加え、タグを継承するので、Xでタグ付けされたカテゴリには、すべての商品にXというタグが付けられます。


一般化するには/これを少し簡素化:私は関連するテーブルのすべてからすべての単一の行をロードしたとき はなぜEntity Frameworkのは、関係に関するクエリを生成しますか?この状況を助けるために私ができることはありますか?


編集:私はそれが実際にあるため、コードのこれらの特定の行を実行したときLiveTraceに表示さADO.NETクエリエントリのとするため、データベースへの呼び出しを作っていると仮定していることを追加する必要がありますパフォーマンスは著しく異なります。だから、私がLiveTraceのエントリーの意味を誤解しているならば、私は別の問題がすべて一緒になっていると思います。

答えて

0

前に任意のクエリを実行する遅延ロードをオフにしてください:

context.ContextOptions.LazyLoadingEnabled = false; 
関連する問題