使用linq在foreach内部时,数据库被锁定而没有ToList()

Miq*_*oll 7 c# sql linq

我试过寻找答案却找不到答案.'问题'很简单:

如果我有一个使用linq的项目集合如下:

var items = db.AnyTable.Where(x => x.Condition == condition).ToList();
Run Code Online (Sandbox Code Playgroud)

使用linq的另一个项目集合但没有ToList():

var items2 = db.AnyTable.Where(x => x.Condition == condition);
Run Code Online (Sandbox Code Playgroud)

如果现在我尝试使用foreach迭代每个项目(我没有尝试while或其他类型的迭代方法):

foreach (var item in items) 
{
    int i = 2;// Doesn't matter, The important part is to put a breakpoint here.
}
Run Code Online (Sandbox Code Playgroud)

如果我在断点处停止代码并且我尝试更新AnyTableon SQL Management Studio一切正常.如果!:

foreach (var item in items2) 
{
    int i = 2;// Doesn't matter, The important part is to put a breakpoint here.
}
Run Code Online (Sandbox Code Playgroud)

如果现在我尝试更新(在断点处)AnyTableon SQL Management Studio我将无法做到(TimeOut).

为什么会ToList()产生这样的差异?

根据我所学到的,特定的区别在于查询正在执行时(在items声明上执行并在声明上items2执行foreach).为什么阻止我更新AnyTable

ome*_*fer 6

只有在访问数据时,linq查询才会转换为SQL查询.当您调用ToList()时,您将创建一个SQL查询,该查询将所有数据返回到db中的代码.现在,项目var完全在内存中,并且不再对db进行任何工作.在第二个示例中,您正在使用foreach,它在db中打开一个trnasaction,并且在此事务仍处于打开状态时,您正在尝试更改将获得超时的数据,因为该表由打开的LINQ查询保持DB.