2017-03-08 33 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; 
});