2017-01-02 40 views
0

我刪除查詢束像以下: -的LINQ如何運行在塊查詢

DELETE FROM [Entry] 
WHERE CompanyId = 1 
    AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
    AND Entry_Date = '2016-12-01' 
    AND Entry_Method = 'I' 

所以在我的代碼,我運行的查詢這份名單如下: -

using (var ctx = new ApplicationDbContext(schemaName)) 
     { 
      foreach (var item in queries) 
      { 
       ctx.Database.ExecuteSqlCommand(item); 
      } 
     } 

但由於大量的查詢執行它會在sql上創建一個鎖,因此我決定在塊中執行查詢,所以我找到了下面的代碼: -

SET ROWCOUNT 500 
delete_more: 
DELETE FROM [Entry] 
    WHERE CompanyId = 1 
     AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
     AND Entry_Date = '2016-12-01' 
     AND Entry_Method = 'I' 
IF @@ROWCOUNT > 0 GOTO delete_more 
SET ROWCOUNT 0 

現在的問題是我如何運行這個東西,因爲我以前通過ctx.Database.ExecuteSqlCommand運行它?

我可以在Linq中運行這個塊查詢代碼的方式是什麼?

+0

你有沒有分裂名單小塊並刪除它們一個大塊嘗試將整個語句放在一個字符串中,並使用'ExecuteSqlCommand'運行? –

+0

@ Nick.McDermaid我一定會試試這個。 – Anup

+0

「不起作用」不適用於我。你有沒有遇到錯誤,或者它沒有達到你的期望?我不知道它是否真的有效。這對我來說是有道理的。 –

回答

1

我會創建一個SQL Server存儲過程,將員工ID作爲參數。讓我們把它叫做「sp_deleteEmployees」與帕拉姆@ids

然後在C#中,你的IDS

string idsList = "3, 4, 6, 7, 14, 17, 20, 21, 22" 
context.Database.ExecuteSqlCommand("usp_CreateAuthor @ids={0} ", idsList); 

編輯

對不起,我想我不明白的問題,創建一個字符串。如果您需要刪除塊的員工,你可以用這個

public static List<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int length) 
{ 
    var count = source.Count(); 
    var numberOfPartitions = count/length + (count % length > 0 ? 1 : 0); 

    List<IEnumerable<T>> result= new List<IEnumerable<T>>(); 

    for (int i = 0; i < numberOfPartitions; i++) 
    { 
     result.Add(source.Skip(length*i).Take(length)); 
    } 

    return result; 
} 

分裂員工的列表您可以使用此方法一次

+0

這件事情起作用。但沒有解決我的實際問題。但我會提出一個不同的問題。 – Anup

+0

對不起,我想我沒有理解這個問題。 –

+0

這裏是新的問題 - http://stackoverflow.com/questions/41436449/linq-how-to-prevent-locks-when-bulk-delete – Anup