【发布时间】:2015-12-16 00:54:23
【问题描述】:
我正在开发一个系统,该系统在工作时将使用新 ID 更新 DB 中给定数量的行。
目前我有大约 900 万行,在选择了该数据的一小部分(大约 10k 项)后,我想遍历每个项并使用新 ID 更新一列。
我目前所拥有的确实有效,但速度太慢而无法使用,因此我需要以某种方式对其进行改进。这是代码,这最初是一个 ForEach 循环,但我读到数组上的“For”循环更快,所以我尝试了这一点,但没有太大改进。
public string UpdateWithNewWidgetId(List<string> allTheWidgetIds, int newWidgetId)
{
var repoPerson = _repositoryFactory.CreateRepository<Person>();
try
{
var person = repoPerson.GetAll(x => fieldToUpdate.Any(val => x.WidgetId == val)).ToArray;
for (int i = 0; i < person.Length; i++)
{
person[i].WidgetId= newWidgetId;
repoPerson.Update(person[i]);
}
repoPerson.SaveChanges();
}
catch (Exception ex)
{
//log error
}
因此,repoPerson 会很快返回大约 10K 项的列表,但 foreach 循环需要很长时间,然后 SaveChanges(这只是执行 Context.SaveChanges())需要更长的时间。
最初我在 foreach 中有 SaveChanges,并认为这是我的问题,但从循环中删除它并没有改善问题。
【问题讨论】:
-
我会为大型操作调用存储过程
-
我将使用 sproc 进行调查,在上面的示例中,您建议通过 sproc 完成整个事情还是只更新?
标签: c# linq-to-entities repository-pattern