2009-12-23 51 views
8

我有2 Linq2Sql類:ParentChild。我想要做一些事情,比如爲父母刪除所有的孩子,或者更新所有的孩子記錄。在SQL我會寫:如何在Linq中運行批量更新/刪除查詢?

delete Child where ParentID = @p 

update Child set Val = Val+1 where ParentID = @p 

我可以Parent類中做到這一點Linq中的蠻力方式:

Children.ToList().ForEach(c => c.DeleteOnSubmit()); // DeleteOnSubmit is my own method 

Children.ToList().ForEach(c => c.Val++); 

但是,給予李nq在ForEach循環中固有的性能損失,這似乎是一種非常低效的做事方式。是否有某種方法可以實現想要的結果,並且只會觸發一個查詢?

回答

9
+0

+1哇,這是一個很棒的鏈接!我正在改變主意,回答信用... –

+0

是的,特里阿尼的解決方案的岩石!回信給你! –

+2

@Shaul現在這可能是一個很好的答案,但只有鏈接的答案有這個問題,遲早他們會變得毫無價值,因爲外部資源無法再到達。在這裏寫下至少一部分解決方案總是會更好,所以只要它活着就可以使用。 – jahu

14

對於這些情況,您可以使用DataContext.ExecuteCommand method直接在數據庫上執行SQL。例如:

dataContext.ExecuteCommand("delete Child where ParentID = {0}", parentId); 
+1

哎,這是醜陋的。不使用文字SQL失敗一半使用Linq的目的? –

+3

@Shaul,絕大部分是,但是LINQ-To-SQL不支持批量更新/刪除,所以這是您的選擇。另一個選項是存儲過程。 –

+0

噢,如果沒有其他的選擇,我想你會得到答案... –

2

看看到用linq進行批量操作。

+0

看起來有趣,謝謝 –

-1

試試這個

_db.tblStockAllocationEurails.Where(t => t.StockNo >= From && t.StockNo <= To).ToList().ForEach(t => t.StatusID = NewGuid); 
_db.SaveChanges(); 
+0

-1,對不起,但這是一個可怕的答案。 –

1

更新和刪除

實體框架的電流限制是爲了更新或刪除您必須先將檢索到內存中的實體。此外,對於單次刪除,必須先檢索該對象,然後才能刪除需要對數據庫進行兩次調用的對象。爲了克服這個問題,我們必須使用EntityFramework.Extended擴展當前的實體框架。 EntityFramework.Extended具有批處理更新和刪除,審覈日誌,查詢結果緩存,未來查詢等有用的功能。批量更新和刪除無需在修改實體之前檢索和加載實體。以下是演示如何刪除,更新的幾行代碼。

通過的NuGet安裝

PM>安裝,包裝EntityFramework.Extended

更新

場景:其中有國家USA更新客戶。 如果我們在沒有任何擴展的情況下執行此操作,我們必須獲取所有擁有美國國家/地區的客戶,修改列表並使用循環對其進行更新。使用Entity Framework.Exdended,我們不需要獲取客戶列表,只需添加where條件,設置更新數據並執行查詢。

static void Main(string[] args) 
{ 
    using(var db = new DataContext()) 
    { 
     db.Customers.Where(c => c.Country == "USA").Update(c => new Customer() 
     { 
      Country = "IN" 
     }); 

     foreach(var customer in db.Customers.ToList())  
     { 
      Console.WriteLine("CustomerInfo - {0}-{1}-{2}", customer.Name, customer.Country, customer.Status); 
     } 
    } 

    Console.ReadLine(); 
} 

https://code.msdn.microsoft.com/entity-framework-batch-994cd739