2016-05-07 5 views
1

現在、linqとrazorをビューエンジンとして使用してasp.net mvcアプリケーションを開発しています。Linq findメソッド

私はLINQでfindメソッドを使用して2つの疑問、一例として、このデータベース・モデルを取って持っている:私は、製品を見つけるために、findメソッドを使用する場合は

enter image description here

を:

Product MyProduct = model.products.Find(id); 

データベースにリクエストすると、IEnumerableのようになります。すべてを選択し、ローカルメモリ内でselectメソッドを実行するか、データベースからレコードを1つだけ受信しますか?私はこれを行う場合

はまた、あなたは、例えば?注文の詳細のように、その製品に関連するすべてのデータを受け取るん:

var OrderDetails = MyProduct.OrderDetails.Where(x=>x.unitprice>10); 

あなたは既にそこに関連するデータを持っているので、それはローカルメモリ(でのselectメソッドあなたはデータベースに別の要求をしますか?

ありがとうございました!

+0

Entity Frameworkを使用して、怠惰なロードと遅延ロードを見てみましょう。 https://msdn.microsoft.com/en-us/data/jj574232.aspx –

+0

あなたは私の答えを見たことがありますか? – CodeNotFound

答えて

2

データベースへのリクエストは、すべてを選択してローカルメモリのselectメソッドを実行するか、データベースから1レコードしか受け取らないIEnumerableのようなものですか?

レコードは1つだけです。ここではDbSet<Product>Findメソッドを使用しているため、コンテキストが既に関連エンティティをロードしているかどうかを最初に確認します。エンティティがロードされている場合は、それを返します。そうでなければ、Findメソッドに渡したidに等しい主キーを持つ製品をロードするSQLクエリを生成します。最後に、ローカルまたはサーバーのいずれかで、指示model.products.Find(id)はすべての製品をロードすることはありませんが、主キーを指定することによって必要なものは1つだけです。

また、注文の詳細など、その商品に関連するすべてのデータを受け取りますか?

遅延ロードを有効にすると、製品に関連するすべての注文詳細が自動的に読み込まれます。

あなたは遅延ロードを有効にしない場合、あなたはあなたの製品の関連オーダーの詳細については、熱心ロードまたは明示的なロードを使用する必要があります。

熱心な負荷にご注文の詳細、あなたは以下のようなInclude拡張メソッドを使用する必要があります。

Product MyProduct = model.products.Include("OrderDetails").Find(id); 

に明示的にご注文の詳細をロードしますが、以下のようなあなたのコレクションプロパティにLoadを使用する必要があります。

Product MyProduct = model.products.Find(id); 
model.Entry(MyProduct).Collection(p => p.OrderDetails).Load(); 

選択方法はローカルメモリにあります(準備が整っていれば のデータがあります)、データベースにもう一度リクエストしますか?

var OrderDetails = MyProduct.OrderDetails.Where(x=>x.unitprice>10); 

あなたは熱心ロードまたは遅延読み込みを使用している場合は、上記の命令は、メモリにフィルタリングします。 明示的なロード

、あなたは、データベースからフィルタしてこれを行うことにより、あなたがしたいだけで、関連する注文の詳細をロードすることができます。

Product MyProduct = model.products.Find(id); 
model.Entry(MyProduct) 
    .Collection(p => p.OrderDetails) 
    .Query() 
    .Where(x=>x.unitprice>10) 
    .Load(); 

製品のOrderDetailsナビゲーション財産上の指示にのみ含まれていますデータベースからロードする注文の詳細。