[英]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.