加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在没有ToList()的情况下使用linq在foreach中锁定数据库

发布时间:2020-12-15 07:40:13 所属栏目:百科 来源:网络整理
导读:我试过寻找答案却找不到答案. ‘问题’很简单: 如果我有一个使用linq的项目集合如下: var items = db.AnyTable.Where(x = x.Condition == condition).ToList(); 使用linq但没有ToList()的另一个项集合: var items2 = db.AnyTable.Where(x = x.Condition =
我试过寻找答案却找不到答案. ‘问题’很简单:

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

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

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

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

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

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我将无法做到(TimeOut).

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

根据我所学到的,特定的区别在于查询正在执行时(对于在声明处执行的项目,在item2上执行它在foreach语句上执行).为什么阻止我更新AnyTable?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读