2016-07-27 107 views
0

我正在使用實體框架將SQL函數轉換爲C#,並且我正在轉換的函數在要加入的每個表(其中10個)上使用NOLOCK提示。實體框架加入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()相同?如果是這樣,我應該使用哪個實現?

回答

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

該聲明將兌現table1中的所有項目到內存中,在表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等)的其他方法之一,該查詢就會實現數據庫結果(Async版本也暗示在這裏)。


其次,我不建議使用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. 

    } 
} 
+0

我不知道我是否曾經使用過它,但是有沒有辦法按照每個表格來做? – adam0101

+1

開箱即用,您的DbContext需要一些額外的邏輯來更改發送到服務器的查詢。你可以使用NOLOCK提示創建一個VIEW並將該視圖映射到IF中的實體,然後從你的C#代碼中一起抽象出NOLOCK提示。 – Igor

+0

我將這些轉換爲我的工作,迄今爲止我轉換的SP更容易。我的直覺告訴我不要質疑NOLOCK,因爲它現在超過了我的薪酬級別。感謝您提示擺脫ToList()。 –