0

我有一个包含产品编号、价格和货币的产品表。我通过带有数据的excel文件上传数据。当我上传数据时,我在后端创建一个列表,其中包含来自 excel 的所有数据,然后将整个列表发送到服务器以更新/插入表中的数据。

               foreach(Product value in item)
                {
                    Product p = context.Product.SingleOrDefault(p => p.ProductNumber == value.ProductNumber && p.CurrencyId == value.CurrencyId);
                    if (p!= null)
                    {

                        context.Entry<Product>(p).Property(p => p.ProductPrice).IsModified = true;
                        p.ProductPrice = value.ProductPrice ;

                        context.SaveChanges();
                    }
                    else
                    {

                        context.Product.Add(value);
                        context.SaveChanges();
                    }
                }

但是随着数据的增加(产品的增加),上传需要很多时间。有什么建议可以优化吗?我在想的一件事是关于产品编号和货币列的索引。

4

1 回答 1

0

性能问题不是由索引引起的(当然,如果不存在索引,这也会有所帮助),而是因为您的代码正在执行的数据库往返次数。

对于每个产品:

  • 您检查产品是否存在(1 个数据库往返)
  • 您插入/更新产品(1 个数据库往返)

因此,如果您从 excel 文件中上传 10,000 个产品,您将执行 20,000 个数据库往返,这太疯狂了。

有一些技巧可能有助于提高性能,例如使用 AddRange 而不是 Add 添加要插入的多个产品,但您最终会遇到由数据库往返次数引起的相同性能问题。

免责声明:我是实体框架扩展项目的所有者

该库允许通过执行以下操作来显着提高性能:

  • 批量保存更改
  • 批量插入
  • 批量更新
  • 批量删除
  • 批量合并

例子:

// Insert or Update using ProductNumber && CurrencyId as the Key
ctx.BulkMerge(list, operation =>
{
    operation.ColumnPrimaryKeyExpression = x => new {x.ProductNumber, x.CurrencyId};
});
于 2016-06-10T16:04:30.680 回答