gpt4 book ai didi

c# - 在没有 ToList() 的带有 linq 的 foreach 中时数据库被锁定

转载 作者:太空狗 更新时间:2023-10-29 20:23:17 24 4
gpt4 key购买 nike

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

如果我有一个使用 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 查询,该查询将所有数据从数据库返回到代码。现在项目 var 完全在内存中,不再对数据库进行任何操作。在第二个示例中,您使用的是 foreach,它在数据库中打开一个事务,并且当此事务仍处于打开状态时,您正在尝试更改数据您将获得超时,因为该表由针对数据库的开放式 LINQ 查询持有。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com