コレクションの最初のアイテムだけを反復処理しても、遅延読み込みはコレクション全体を読み込みますか?または、コレクション内で反復処理されるアイテムのみをロードしますか?遅延読み込みは、繰り返し時にコレクション全体をロードしますか?
...または私は何を言っているのか分かりませんか?
コレクションの最初のアイテムだけを反復処理しても、遅延読み込みはコレクション全体を読み込みますか?または、コレクション内で反復処理されるアイテムのみをロードしますか?遅延読み込みは、繰り返し時にコレクション全体をロードしますか?
...または私は何を言っているのか分かりませんか?
コレクション全体を繰り返し処理を開始すると、レイジーロードによってコレクション全体が読み込まれます。例:あなたはRole2
とRole3
彼らはそれにもかかわらず、ロードされているにアクセスすることはありませんが、
var user = context.Users.Single(u => u.Id == 1);
foreach (var role in user.Roles) // DB query happens here once
{
Console.WriteLine(role.Name);
if (role.Name == "Role1")
break;
}
:user
1ロール "ROLE1"、 "ROLE2"、 "Role3を"(user.Roles
がvirtual
である)があるとします。
ソースの列挙型を反復処理するたびに1回投影を反復処理します。
@ Slaumaの答えは正しい - ナビゲーションプロパティに初めてアクセスすると、コレクション全体が読み込まれます。これは、コレクションが通常のICollection <>であり、IQueryable <>ではないため、通常のナビゲーションプロパティではこのようにする必要があります。
ただし、コレクション全体が読み込まれないようにするには、2つの方法があります。コンテキストを使用できる場合は、Queryメソッドを使用して実際に遅延読み込みを行うことができます。例:
foreach (var role in context.Entry(user).Collection(e => e.Roles).Query())
{
Console.WriteLine(role.Name);
if (role.Name == "Role1")
break;
}
あなたが探しているエンティティを事前に把握している場合は、これを少し前にすることができます。例えば、ちょうどROLE1をロードするために、あなたは何ができる:
var role1 = context.Entry(user)
.Collection(e => e.Roles)
.Query()
.Single(r => r.Name == "Role1");
をこのポストは、Queryメソッドにいくつかの詳細を提供します。あなたはドンというこのよりtransaprentは、このような作りにしたい場合は
クエリを実行するときにコンテキストを利用できるようにする必要がある場合は、特別なコレクションを作成する方法を説明するブログ記事をご覧ください。
http://blog.oneunicorn.com/2011/03/28/extra-lazy-collection-count-with-ef-4-1-part-1/
、より一般的なのIQueryable担保コレクション:
http://blog.oneunicorn.com/2011/03/30/a-more-general-queryable-collection/
私はまた、いくつかのテストで私の答えが間違っていることを発見しました。レイジーローディングの部分について、あまりにも多くの希望的な考え方があると思います。途中で良い説明。 –
DBクエリに関する最初の例は何ですか?すべての反復で1つのロールに対して1つのクエリを生成しますか?実際には、反復を開始するときに* all *ロールのクエリが1つしかないことが実際には予想されました。うーん、興味深い... – Slauma
いくつかのコードを投稿してください。 – jrummell
'ObjectContext'には' ObjectMaterialized'イベントがあります。見つけ出すためにコレクションを繰り返していくうちに、このイベントを聞くことができます。 – cadrell0
@Alex Ford、IEnumerableの特定のケース(エンティティフレームワーク)または一般的なケースに興味がありますか?私。 IEnumerableの実装では、あなたが1つを求めるときはいつでも、7のセットで項目を取得することに何も止まらない。 –