web-dev-qa-db-ja.com

LINQでInclude()は何をしますか?

私は多くの研究をしようとしましたが、私はdbの男です-だからMSDNの説明でさえ意味がありません。誰でも説明して、SQLクエリという用語でInclude()ステートメントが何をするかの例を提供できますか?

70
C.J.

たとえば、すべての顧客のリストを取得するとします。

var customers = context.Customers.ToList();

そして、各CustomerオブジェクトにはOrdersのセットへの参照があり、各OrderにはLineItemsへの参照があり、Productへの参照もあると仮定します。 。

ご覧のとおり、多くの関連エンティティを持つトップレベルのオブジェクトを選択すると、多くのソースからデータを取得する必要があるクエリが発生する可能性があります。パフォーマンス測定として、Include()を使用すると、同じクエリの一部としてデータベースから読み取る必要がある関連エンティティを指定できます。

同じ例を使用すると、関連するすべての注文ヘッダーが取り込まれますが、他のレコードは取り込まれません。

var customersWithOrderDetail = context.Customers.Include("Orders").ToList();

SQLを要求してからの最後のポイントとして、Include()のない最初のステートメントは単純なステートメントを生成できます。

SELECT * FROM Customers;

Include("Orders")を呼び出す最終ステートメントは次のようになります。

SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
123
Yuck

「Include」は熱心なロードの一部であることを付け加えたかっただけです。 MicrosoftによるEntity Framework 6チュートリアルで説明されています。リンクは次のとおりです。 https://docs.Microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data -with-the-entity-framework-in-an-asp-net-mvc-application


リンクされたページからの抜粋:

Entity Frameworkがエンティティのナビゲーションプロパティに関連データをロードできるいくつかの方法を次に示します。

遅延読み込み。エンティティが最初に読み込まれたとき、関連データは取得されません。ただし、ナビゲーションプロパティに初めてアクセスしようとすると、そのナビゲーションプロパティに必要なデータが自動的に取得されます。これにより、複数のクエリがデータベースに送信されます。1つはエンティティ自体に、もう1つはエンティティの関連データを取得する必要があるたびに送信されます。 DbContextクラスは、デフォルトで遅延読み込みを有効にします。

Eager loading。エンティティが読み取られると、関連データがそれとともに取得されます。これは通常、必要なすべてのデータを取得する単一の結合クエリになります。 Includeメソッドを使用して、積極的な読み込みを指定します。

明示的なロード。これは、コードで関連データを明示的に取得することを除いて、遅延ロードと似ています。ナビゲーションプロパティにアクセスしても、自動的には発生しません。エンティティのオブジェクト状態マネージャーエントリを取得し、コレクションのCollection.Loadメソッドまたは単一のエンティティを保持するプロパティのReference.Loadメソッドを呼び出すことにより、関連データを手動でロードします。 (次の例では、Administratorナビゲーションプロパティを読み込む場合、Collection(x => x.Courses)Reference(x => x.Administrator)に置き換えます。)通常、明示的な読み込みは、遅延読み込みをオフにした場合にのみ使用します。

プロパティ値をすぐに取得しないため、遅延読み込みと明示的な読み込みは両方とも遅延読み込みとも呼ばれます。

19
Minoosha

サブアイテムが遅延ロードされるシナリオで、Eager-Loadingを強制すると考えてください。

クエリEFがデータベースに送信すると、最初はより大きな結果が得られますが、アクセス時には、含まれているアイテムにアクセスするときにフォローアップクエリは実行されません。

一方、それなしでは、サブ項目に最初にアクセスしたときに、EFは後でseparteクエリを実行します。

1
robkrueger