快速更新许多行的方法

时间:2015-12-15 16:42:18

标签: c# linq-to-entities repository-pattern

我正在开发一个系统,在工作时,将使用新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并且认为这是我的问题,但是从循环中删除它并没有改进。

2 个答案:

答案 0 :(得分:1)

对于大数据量,您需要查看以下主题:

Bulk Update in C#

通常,如果您需要执行大量的插入/更新数据,实体框架是不够的 - 需要使用更快的SqlBulkCopy方法。

答案 1 :(得分:-1)

尝试添加事务,应该加快上下文SaveChanges事件

using (Context context = new Context())
        {
            using (var dbContextTransaction = context.Database.BeginTransaction())
            {
             ...yours code
             context.SaveChanges();
             dbContextTransaction.Commit();
            }
        }