我是实体框架的新手,所以我希望这不是一个缺位 基本上我有一个大的有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计算后找到最佳(高效)方式来更新所有这些记录。任何帮助将非常感谢:)
提前致谢
答案 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;
});