Entity Framework 加入 NOLOCK

Entity Framework Joins with NOLOCK

我正在使用 Entity Framework 将 SQL 函数转换为 C#,并且我正在转换的函数在每个 table(共 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>();

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

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

该语句会将 table1 中的所有项目具体化到内存中,将 table2 中的所有项目具体化到内存中,然后在内存中加入以供查询的其余部分使用。除非您根本不关心性能,否则不要这样做。而是删除 ToList 调用并像这样加入。

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

这将在 sql 服务器中产生一个连接,现在您可以在 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.

    }
}