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 中产生不同的结果?即 Table1
与 context.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.
}
}
我正在使用 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 中产生不同的结果?即 Table1
与 context.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.
}
}