1

私はエンティティフレームワークのコードの最初のアプローチを使用してAsp.Net mvcプロジェクトを開発しています。しかし私は自分のアプリケーションのパフォーマンスを改善しようとしています。同じ条件に再度アクセスすると、Entity Frameworkがデータベースクエリを再度実行するかどうかはわかりません。下記の私のシナリオをご覧ください。Entity Frameworkは、すでに実行されたクエリに対してデータベースクエリを再度実行しますか?

var item = context.Items.FirstOrDefault();// Database query will be run for this 
var start = item.Promotions.FirstOrDefault().Start; // Another query will be run for this 
var end = item.Promotions.FirstOrDefault().End; //Will another query be run again? Same query is run again for this 
var price = item.Promotions.FirstOrDefault().Price; //Here also 

コードでわかるように、新しいクエリが実行されてプロモーション開始日が取得されます。しかし、私が終了日を取得すると、データベースは同じクエリであってもクエリを再度実行します。説明してください。私はそれを混乱させる。

答えて

3

答えが正しいですが、オブジェクトが今、すべてのオブジェクトロードされたオブジェクト

var item = context.Items.FirstOrDefault();// Database query will be run for 

からデータを読み込みを停止するよう

あなたの元のクエリ

var item = context.Items.FirstOrDefault();// Database query will be run for this 
var start = item.Promotions.FirstOrDefault().Start; // Another query will be run for this 
var end = item.Promotions.FirstOrDefault().End; //Will another query be run again? Same query is run again for this 
var price = item.Promotions.FirstOrDefault().Price; //Here also 

ロード項目を検討する別のオプションがありますクエリを生成せずに読み出すためにメモリに保持される。

あなたが遅延ロードされたときにデータを取得するために今すぐ

は VARプロモーション= item.Promotions.FirstOrDefault() であり、これは質問は、あなたがプロモーション毎回読んでいる場合、それは希望で別のクエリ

promotion.Start 
promotion.End 

が生成されますオブジェクトをフェッチしているときに、それは子オブジェクト

var item = context.Items.Include(x=>x.Promotions).FirstOrDefault(); 

をロードし、アイテムに関するデータを取得するためにDBへの唯一のクエリになります(積極的なロードを使用して)、クエリでそれを含める方がよいですとth eプロモーション。あなたは、クエリを更新することができます

特定の選択は、使用して興味のある項目だけを選択するには:

var customObj = context.Promotions.Where(p=>p.ItemId==itemId).Select(x=>new{x.Start, x.End, x.Price}).FirstOrDefault(); 

そして、この方法は、あなたが特定の選択を受け取ることになりますし、それが特定のクエリを生成します。あなたのために。あなたが生成するものを参照するには、SQL 使用するSQLプロファイラ/アリプロファイラなど

注意。

+0

だから私はこのcontext.Items.Include(x => x.Promotions)のように取得します。次に、このようなアイテムを取得します。var item = items.FirstOrDefault()。 Uがitem.Promotions.FirstOrDefault()にアクセスすると、クエリは再び実行されますか? –

+0

いいえデフォルトではアイテムに関連付けられたすべてのインスタンスが含まれます – cpoDesign

+0

1対1の関係の場合はどうなりますか?例var item = context.items.FirstOrDefault(); var start = item.Promotion.Start; var end = item.Promotion.End。ご覧のとおり、私は変数に代入してキャッシュしませんでした。プロモーションの終了日を取得すると、もう一度別のクエリが実行されますか? –

1

その間にデータベースのデータが変更されている可能性があります。そのため、EFがクエリを再度実行しています。

、パフォーマンスを向上させるだけで、結果を自分をキャッシュするには、次の

var item = context.Items.FirstOrDefault(); // Database query will be run for this 
var promotion = item.Promotions.FirstOrDefault(); // Another query will be run for this 
var start = promotion.Start; // No additional query 
var end = promotion.End;  // No additional query 
var price = promotion.Price; // No additional query 

ところで:これは、遅延ロードとは何の関係もありません。レイジーローディングは、参照する他のエンティティを遅延ロードすることに関連しています。データとは関係ありません。

+0

ありがとうございます。 –

+0

1対1関係の場合はどうなりますか?例var item = context.items.FirstOrDefault(); var start = item.Promotion.Start; var end = item.Promotion.End。ご覧のとおり、私は変数に代入してキャッシュしませんでした。プロモーションの終了日を取得すると、もう一度別のクエリが実行されますか? –

関連する問題