c# - 循环访问 IQueryable 与在 C# 中使用 Reader.Read() 循环访问 Datareader 相同吗

标签 c# sql linq entity-framework linq-to-sql

抱歉标题太长了:)

我真的找不到任何答案,这个问题已经在我脑海中盘旋了一段时间了。最后问题的简短摘要。

基本上我想知道 linq toEntity/sql 是否在将结果集映射到实体/sql 类之一之前循环通过数据读取器,或者是否已经映射。在我可以循环访问 Iqueryable 之前,Iqueryable 是否必须循环访问数据读取器。为了展示我在代码中的意思,我想知道是否

foreach(object o in SomeIQueryableObject)
{
    ...do stuff with the object
}

将导致A:

 while(Reader.Read())
{
     SomeIqueryableObject.Add(Reader.TranslateRow());
}
//now the iqueryable has been loaded with objects and we can loop through it
//with the above code
foreach(object o in SomeIQueryableObject)
{
    ...do stuff with the object
}

或者会导致B:

while(Reader.Read())
{
    ...do stuff with the object
}
//Iqueryable doesn't have to loop through Reader
//before you can loop through Iqueryable.

简短摘要:当我在 iqueryable 上使用 foreach 时,这是否相当于使用 Reader.Read() 循环遍历 datareader

最佳答案

恐怕正确的答案是:这取决于情况。

首先 - 这取决于 IQueryable 的类型我们正在谈论的实现; IQueryable<T>只是一个接口(interface),实际的实现留给实现者。据我所知,微软没有提供任何严格的指导方针来说明如何做到这一点(哎呀,没有人说 IQueryable<T> 需要与数据库有任何共同点,这将使问题变得毫无意义)。

当我们将自己限制在 linq-to-sql/entity-framework 时,答案仍然是:这取决于(至少对于 linq-to-sql 而言,尽管如果 EF 的工作方式有很大不同,我会感到惊讶)。这取决于几个因素(例如您正在执行的查询类型、数据量等)。基本上它的工作方式与您的第二个伪代码类似(即不一次加载所有数据),但可以使用优化来检索 block /缓冲数据中的数据,因此在某些情况下,数据库端的查询执行可能比您的枚举(尽管尝试利用它可能是......不平凡的)。

如果要模拟批量加载版本,显式调用ToList()/ToArray() (或使用任何其他会导致读取所有数据的方法)。

关于c# - 循环访问 IQueryable 与在 C# 中使用 Reader.Read() 循环访问 Datareader 相同吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22529752/

相关文章:

c# - 将脏 Excel 2007 文件导入并清理到 SQL Server 2005

c# - Linq - XElement 比较

c# - PayPal Express - 如何整合卡支付?

c++ - ODBC - 用 C++ 编写准备好的语句

linq - 如何获取与其他列表不同的列表(LINQ)?

java - 构造函数注入(inject),避免非依赖参数

mysql - 在不使用集合运算符(UNION)的情况下组合选择查询的结果

sql - 查询一个表以及表中存储的列名

c# - 使用 linq 根据 Id 列表选择多条记录

C# Linq to SQL 包含安全的 sql 注入(inject)