9

Entity Framework を使用して、テーブルからいくつかのデータを選択し、foreachループで反復処理します。次の例では、いつデータがクエリされているのでしょうか?

例 1。

var countries = db.WorldCountries;
foreach(var item in countries)
{
    Console.WriteLine("Country: {0}", item.Country);
}

例 2。

var countries = db.WorldCountries.Where(t => t.Country == "Country Name");
foreach(var item in countries)
{
    Console.WriteLine("Country: {0}", item.Country);
}

最初の例でcountriesは、 is ですDbSet<WorldCountries>。2 番目の例では、 countriesisIQueryable<out WorldCountries>です。

上記の例の がなければ、.ToList()データはどのように取得されますか? foreachループの開始時に (.ToList()最初の反復の開始時に呼び出されたかのように)データ セット全体を取得するか、ループの各反復でデータベースにクエリを発行します。

ありがとう。

4

1 に答える 1

12

どちらの例でも、IQueryable<WorldCountries>は SQL にコンパイルされ、入力した時点で実行されますforeach( がforeach呼び出されたときGetEnumerator)。したがって、最初の反復の直前に db から結果を受け取ります。反復ごとに 1 つずつではありません。反復ごとに個別の SQL クエリではありません)。

DbSet<T>も実装することに注意してIQueryable<WorldCountries>ください。したがって、2番目の例にたまたまwhere句が含まれていることを除いて、両方の例は同じように機能します。

を追加する.ToListと、それが繰り返されてリストがいっぱいになり、返されるため、次のステートメントに進む前に必要なすべてのデータをデータベースから転送します。

于 2013-08-13T18:21:25.410 に答える