迭代DbSet <tentity> vs IQueryable <out t =“”> </out> </tentity>

时间:2013-08-13 18:12:02

标签: 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);
}

在第一个示例中,countriesDbSet<WorldCountries>在第二个示例中,countriesIQueryable<out WorldCountries>

如果没有上述示例中的.ToList(),如何检索数据?是在foreach循环开始时检索整个数据集(就像在第一次迭代开始时调用.ToList()一样),或者在循环的每次迭代中向数据库发出查询。

感谢。

1 个答案:

答案 0 :(得分:10)

在这两个示例中,IQueryable<WorldCountries>都编译为SQL并在您输入foreach时执行(foreach调用GetEnumerator时)。所以你在第一次迭代之前就收到了db的结果,而不是每次迭代都是一块一块的。(结果是通过DataReader得到的,所以实际的数据传输可能是每次迭代都是一块一块地完成但是我的意思是,那里在每次迭代时都不是单独的SQL查询。)

请注意DbSet<T>也实现了IQueryable<WorldCountries>,所以你的两个例子都是一样的,除了第二个例子恰好包含一个where子句。

当您添加.ToList时,它会在返回之前迭代并填充列表,因此在这种情况下,您将转移数据库中的所有必要数据,然后再转到下一个语句。