我有一个产品表,包括产品编号,价格和货币。 我通过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();
}
}
但随着数据的增加(产品增加),上传需要花费大量时间。 有什么建议可以优化吗?我想的一件事是关于产品编号和货币栏的索引。
答案 0 :(得分:0)
性能问题不是由于索引引起的(当然,如果不存在索引,这也会有帮助)但是由于您的代码正在执行的数据库往返次数。
对于每件产品:
因此,如果您从excel文件上传10,000个产品,您将执行20,000次数据库往返,这是疯狂的。
有一些技巧可能有助于提高性能,例如添加多个产品以使用AddRange而不是Add来插入,但最终会出现由数据库往返次数引起的相同性能问题。
免责声明:我是该项目的所有者Entity Framework Extensions
此库允许通过执行以下操作来显着提高性能:
示例:
// Insert or Update using ProductNumber && CurrencyId as the Key
ctx.BulkMerge(list, operation =>
{
operation.ColumnPrimaryKeyExpression = x => new {x.ProductNumber, x.CurrencyId};
});