2017-03-08 50 views
0

我是新來的實體框架,所以我希望這不是一個無。
基本上我有一個大的30000到100000之間的記錄。從根本上講,每條記錄中有趣的字段是ID和總數,必須在應用程序端進行計算。實體框架6大表批量更新

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

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的新Total來更新整個SQL表,這裏是我的噩夢開始。例如,一些基本如下,走的時候

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

我做了一些期試驗研究,結果發現,EF不支持批量opperations,它不支持TableTyped參數的存儲過程數額特別巨大。

所以,我假裝是找到最佳(高性能)的方式來更新每次總計算後的所有記錄。任何幫助將grealtlly讚賞:)

在此先感謝

+1

此[鏈接](http://entityframework-extensions.net/?z=codeplex)可以是有用的 – Anton

+1

看起來像的東西,將很容易地(和更快)解決了一個很好的舊存儲過程 – jeroenh

回答

0

您可以使用原始命令。例如:

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

由於SQL注入可能不是一個好主意。 – Catwood

+0

沒有SQL注入的可能性,因爲Total和Id由我們計算;) –

+0

現在可能是這樣,但隨着應用程序的發展,誰知道這些值可能來自哪裏。如果陳述是參數化的,那麼它會爲此辯護。 – Catwood

0

最有效的方法是@jeroenh評論。如果可能的話,將所有內容都存儲在存儲過程中。

免責聲明:我的Entity Framework Extensions

車主該庫是不是免費的,但允許你執行批量更新等操作爲這種情況的:

  • 散裝的SaveChanges
  • Bulk Insert
  • Bulk Delete
  • Bulk Update
  • 批量合併

// 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; 
});