实体框架6大表批量更新

时间:2017-03-08 09:45:30

标签: c# sql-server entity-framework

我是实体框架的新手,所以我希望这不是一个缺位 基本上我有一个大的有30000到100000记录。从根本上说,每条记录的有趣字段是必须在应用程序端计算的ID和总计。

所以我正在获取记录,将它们投影到Business Logic类,执行各种计算并将新Total分配给该类。

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不支持批量操作,并且它不支持存储过程的TableTyped参数。

所以,我假装是在每次Total计算后找到最佳(高效)方式来更新所有这些记录。任何帮助将非常感谢:)

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以使用原始命令。类似的东西:

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

答案 1 :(得分:0)

最有效的方式是@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;
});