C# 实体框架与NOLOCK连接

C# 实体框架与NOLOCK连接,c#,entity-framework,nolock,C#,Entity Framework,Nolock,我正在使用实体框架将一个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>

我正在使用实体框架将一个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>();
IEnumerable Table1=新列表();
然后在我开始查询之前使用上下文填充它们会在这些表中产生不同的结果吗?也就是说,
Table1
是否与
context.Table1.ToList()相同?如果是,我应该采用哪种实现方式

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.

    }
}
该语句将表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.

    }
}

我不知道我是否会使用它,但是有没有一种方法可以在每个表中使用它?没有现成的方法,需要在DbContext中添加一些逻辑来更改发送到服务器的查询。你可以创建一个带有NOLOCK提示的视图,并将该视图映射到IF中的一个实体,然后将NOLOCK提示从你的c#代码中抽象出来。我将这些转换为我的工作,到目前为止我转换的SP更容易。我的直觉告诉我不要质疑NOLOCK,因为现在这已经超过了我的工资等级。谢谢你提供摆脱托利斯特()的建议。@C-Scholl20-很高兴它有所帮助。如果您认为答案是正确的,请不要忘记使用复选框标记答案。我不知道是否曾经使用过它,但是否有一种方法可以在每个表中使用它?没有现成的方法,需要在DbContext中使用一些附加逻辑来更改发送到服务器的查询。你可以创建一个带有NOLOCK提示的视图,并将该视图映射到IF中的一个实体,然后将NOLOCK提示从你的c#代码中抽象出来。我将这些转换为我的工作,到目前为止我转换的SP更容易。我的直觉告诉我不要质疑NOLOCK,因为现在这已经超过了我的工资等级。谢谢你提供摆脱托利斯特()的建议。@C-Scholl20-很高兴它有所帮助。如果您认为答案正确,请不要忘记使用复选框标记答案。