私は EF を初めて使用し、いくつかの記事を読みました。読んだ後、遅延読み込みと熱心な読み込みの違いは何ですか?
- 両方のタイプのクエリをコンパイルできますか?
- 両方のタイプのクエリを返すことができます
IQuerable
かIEnumerable
? - 両方のタイプのクエリで、Linq to Entities クエリ構文 (select、from、where) とラムダ式を使用できますか?
親切に私を導き、助けてください。
あなたの時間と指導に感謝します
私は EF を初めて使用し、いくつかの記事を読みました。読んだ後、遅延読み込みと熱心な読み込みの違いは何ですか?
IQuerable
かIEnumerable
?親切に私を導き、助けてください。
あなたの時間と指導に感謝します
遅延読み込みと熱心な読み込みの違いについて:
has プロパティを持つCustomer
オブジェクトがあるとしますList<Invoice> Invoices
(これは別のテーブルにあり、Entity Framework によって自動的に結合されます)。
請求書をlazy
ロードすると、Customer オブジェクトがインスタンス化されたときにすぐにフェッチされるのではなく、必要な場合や明示的にアクセスした場合にのみフェッチされます。
請求書をeager
ロードすると、すぐにオブジェクトで請求書が取得され、構築/入力されます (顧客の巨大なリストを作成するが、すべての請求書をオブジェクトですぐに利用できるようにする必要がない場合、不要なパフォーマンス オーバーヘッドが発生します)。
ドキュメントはこちらにあります。
両方のタイプのクエリをコンパイルできますか?
手動で事前にコンパイルされたクエリに含めることができるのは、熱心な読み込みのみです。遅延読み込みクエリは EF によって自動的に作成され、実際にプリコンパイルされている場合は EF の内部動作です。
両方のタイプのクエリが IQuerable と IEnumerable を返すことはできますか?
熱心な読み込みでは、クエリが返すかどうかを制御できますIQueryable
またはIEnumerable
. 遅延読み込みクエリは制御不能であり、変更することはできません。IQueryable
遅延ロードされたナビゲーション プロパティに使用する場合は、IQueryable
特定のナビゲーション プロパティのクエリを取得し、それを変更できる、明示的ロードと呼ばれる 3 番目のオプションを使用する必要があります。
両方のタイプのクエリで、Linq からエンティティへのクエリ構文 (select、from、where) とラムダ式を使用できますか?
いいえ。これらのクエリには、select、from、where はありません。遅延読み込みは制御不能であり、積極的読み込みはフィルタリングを許可しません。どちらの場合も、関連するすべてのオブジェクトを常に読み込みます。
明示的なクエリの例 (クエリを使用できる唯一の読み込みタイプ):
var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
.Where(...);
遅延読み込みは、実際に必要なときにのみ関連するオブジェクトを読み込みます。熱心な読み込みはこれの反対です。戦略の選択は、実際には必要ないときに大きなデータセットをロードするなど、パフォーマンスに大きな影響を与える可能性があります。