簡體   English   中英

實體框架6大表批量更新

[英]Entity Framework 6 large table bulk update

我是實體框架的新手,所以我希望這不是廢話。
基本上,我有一個大型文件,上面有30000至100000個記錄。 從根本上講,每個記錄上有趣的字段是ID和總計,必須在應用程序端進行計算。

因此,我正在獲取記錄,將它們投影到業務邏輯類中,以執行各種計算並將新的總計分配給該類。

var validPriceVersionID = context.PriceVersion.Where(f => f.Status == "VALID").FirstOrDefault().PriceVersionID;
                var tmp = context.EndItem.Where(f => f.Total == 0).Project().To<EndItem>().ToList();
                tmp.Select(c => { c.PriceVersionID = validPriceVersionID; return c; }).ToList();

現在,我需要根據ID使用新的總計更新整個SQL表,這就是我噩夢開始的地方。 例如,以下基本內容需要花費大量時間

var idTotalPair = tmp.Select(x => new {x.EndItemID, x.Total}).ToArray(); 

我進行了一些研究,發現EF不支持批量操作,並且不支持用於存儲過程的TableTyped參數。

因此,我假裝的是在每次“總計”計算之后找到最佳的(性能)方法來更新所有這些記錄。 任何幫助將不勝感激:)

提前致謝

您可以使用原始命令。 就像是:

   using (var context = new MyContext()) 
   { 
       context.Database.ExecuteSqlCommand( 
           "UPDATE EndItem SET Total = ... WHERE EndItemId = ..."); 
   }

最有效的方法是@jeroenh注釋。 盡可能將所有內容存儲在存儲過程中。

免責聲明 :我是Entity Framework Extensions的所有者

該庫不是免費的,但允許您針對這種情況執行批量更新和其他操作:

  • 批量保存更改
  • 批量插入
  • 批量刪除
  • 批量更新
  • 批量合並

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(endItems);
context.BulkInsert(endItems);
context.BulkUpdate(endItems);

// Customize Primary Key
context.BulkMerge(endItems, operation => {
   operation.ColumnPrimaryKeyExpression = 
        endItem => endItem.Code;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM