一尘不染

通过IQueryable循环与使用C#中的Reader.Read()通过Datareader循环相同

sql

抱歉,长标题:)

我真的找不到任何答案,这个问题已经绕了我一段时间。最后是问题的简短摘要。

基本上,我想知道linq到实体/ 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()遍历数据读取器


阅读 130

收藏
2021-05-30

共1个答案

一尘不染

AFAIK
EF将使用您的第二个选项。之所以这样说,是因为我经历了EF在循环浏览第一个查询的结果时执行另一个查询时会打开第二个连接的情况。由于我正在使用事务,并且我禁用了分布式事务,并且第二个打开的连接(虽然第一个连接仍处于打开状态并且已使用)禁用了当前事务的重用,所以我的第二个查询抛出了一个异常,说DTC不是未启用。

所以我的结论是:如果您正在执行查询并遍历结果(因此为no
.ToList()),则查询仍在执行,并且连接仍处于打开状态,并且如果EF使用的是数据读取器,则为在从数据读取器读取的循环中。

2021-05-30