我尝试寻找答案,但找不到。 “问题”很简单:

如果我使用linq收集项目,如下所示:

var items = db.AnyTable.Where(x => x.Condition == condition).ToList();

以及另一个使用linq但没有ToList()的项目集合:
var items2 = db.AnyTable.Where(x => x.Condition == condition);

如果现在我尝试使用foreach迭代每个项目(我没有尝试while或其他类型的迭代方法):
foreach (var item in items)
{
    int i = 2;// Doesn't matter, The important part is to put a breakpoint here.
}

如果我在断点处停止代码,并尝试在SQL Management Studio上更新AnyTable,则一切正常。但是如果!:
foreach (var item in items2)
{
    int i = 2;// Doesn't matter, The important part is to put a breakpoint here.
}

如果现在我尝试更新(在断点时)SQL Management Studio上的AnyTable,则将无法执行(超时)。

为什么ToList()有这么大的不同?

从我了解到的一个特别的区别是执行查询的时间(在items上它在声明中执行,在items2上它在foreach语句上执行)。为什么这会阻止我更新AnyTable

最佳答案

仅当您访问数据时,linq查询才会转换为SQL查询。
当您调用ToList()时,您将创建一个SQL查询,该查询将所有数据从db返回到代码中。现在,项var完全位于内存中,不再需要对数据库做任何工作。
在第二个示例中,您使用的是foreach,它将在数据库中打开一个事务,
并且当此交易仍未完成时,您正在尝试更改数据
您将获得超时,因为该表由针对数据库的打开LINQ查询保存。

关于c# - 在带有linq而没有ToList()的foreach内时,数据库被锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37160406/

10-09 23:43
查看更多