9

使用实体框架,我从表中选择一些数据并使用循环对其进行迭代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()在第一次迭代开始时调用的一样)或在循环的每次迭代中向数据库发出查询。

谢谢。

4

1 回答 1

12

在这两个示例中,都IQueryable<WorldCountries>被编译为 SQL 并在您输入的点foreachforeach调用时GetEnumerator)执行。因此,您在第一次迭代之前从数据库接收结果,而不是在每次迭代中逐个接收结果。(结果来自 DataReader,因此每次迭代可能会逐个完成实际数据传输,但我的意思是,那里不是每次迭代的单独 SQL 查询)。

请注意,DbSet<T>还 implements IQueryable<WorldCountries>,因此您的两个示例的工作方式相同,除了第二个示例恰好包含 where 子句。

当您添加.ToList时,它会在返回之前迭代并填充一个列表,因此在这种情况下,您可以在继续下一条语句之前从数据库中传输所有必要的数据。

于 2013-08-13T18:21:25.410 回答