实体框架与NOLOCK联合

本文关键字:联合 NOLOCK 框架 实体 | 更新日期: 2023-09-27 17:58:51

我正在使用实体框架将SQL函数转换为C#,并且我正在转换的函数在每个要连接的表(其中10个)上使用NOLOCK提示。

因此,我决定将整个事务的IsolationLevel设置为ReadUncommitted。目前,我正在进行这样的内部联接。

from a in context.table1.ToList()
join b in context.table2.ToList on a.Id equals b.Id

等等

会声明列表,例如

IEnumerable<table1> Table1 = new List<table1>();

然后在我开始查询之前使用上下文填充它们,在这些表中产生不同的结果?I.e Table1context.table1.ToList()相同吗?如果是,我应该采用哪种实现方式?

实体框架与NOLOCK联合

from a in context.table1.ToList()
join b in context.table2.ToList on a.Id equals b.Id

该语句将把表1中的所有项具体化到内存中,把表2中的所有项都具体化到存储器中,然后在查询的其余部分加入内存。除非你根本不在乎表现,否则不要这样做。相反,删除ToList调用并像这样加入。

from a in context.table1
join b in context.table2 on a.Id equals b.Id

这将在sql server中产生一个联接,现在您可以在Linq中继续执行查询的剩余部分。一旦您开始迭代结果,或者使用扩展方法ToList、ToArray、AsEnumerable,或者其他检索单个项(如single或First等)的方法之一,查询就会从数据库中具体化结果(这里也暗示了异步版本)。


其次,我不建议使用NOLOCK,除非你知道不正确的数据并不是什么大不了的事情,比如在没有对这些数据做出决定的情况下显示不稳定的数据,否则你可能会弹出意想不到的结果。现在,如果这不会困扰您,并且您仍然想使用等效的NOLOCK,那么请围绕EF调用创建一个新的事务。

using (new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) 
{
    using (var context = new MyDbContext()) 
    { 
        var result = from a in context.table1
            join b in context.table2 on a.Id equals b.Id
            // rest of your linq query here.
    }
}