抱歉标题太长了:)
我真的找不到任何答案,这个问题已经在我脑海中盘旋了一段时间了。最后问题的简短摘要。
基本上我想知道 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/