使用 Entity Framework 优化 LINQ 查询

Optimizing LINQ Query using Entity Framework

我使用以下 LINQ 查询获取产品信息 Entity Framework

productDetails.Items = (from productDetail in db.ToList()
                            select new prod
                            {
                                ID = productDetail.ID
                            ProdName = productDetail.ProductName,
                                        ...
                                        ...
                                        ...
                                        ...
                            Calaculation1 = GetCalaculation(productDetail.Calc1),
                            Calaculation1 = GetCalaculation(productDetail.Calc2),
                                        ...
                                        ...
                                        ...
                                        ...
                                        Calaculation15 = GetCalaculation(productDetail.Calc3)
                            }
                        ).ToList();

其中 GetCalaculation 方法还使用 LINQ 查询数据库。如果我要获取 100 条记录,查询会很慢。我该如何优化它?

首先,您 select 的结构对我来说看起来 "little" 有问题,因为您为每条记录获取 15 Calaculation 属性。即使您在数据库中创建一个视图,它也会有 15 Joins 到计算 table,这对性能非常不利。所以你应该做的第一件事是检查你的对象结构并确认你真的需要在一个请求中获取所有这些计算。 如果您坚持不能更改您的结构,这里有一些可以显着提高性能的步骤:

  1. 如果 table 不经常更改,您可以考虑创建包含已计算数据的物化视图(在 SQL 服务器中使用聚集索引查看)。在这种情况下,查询将非常快,但 table 中的 Inserts/Updates 会慢得多。
  2. 不要在您的查询中使用 db.ToList() - 这样您就可以将所有 table 都提取到内存中,然后为每个计算发出单独的查询.

  3. 我对这个查询有点困惑:

    var dbQuery = from calculation in db.Calculations 
                  where calculation.calc == calc1 select calculation); 
    var totalsum = (from xyz in dbQuery select (Decimal?)xyz.calc).Sum() ?? 0;
    

您正在获取所有具有 calc == calc1 的记录,然后计算它们的总和?计算有多少记录有 calc == calc1 然后乘以 calc1

不是更容易吗
db.Calculations.Count(c=>c.calc == calc1) * calc1;
  1. 将所有计算 table 与产品 table ( var calcTable = db.Calculations.ToList() ) 一起提取到内存中可能会更便宜,如果它的记录数量有限,那么 GetCalaculation 将在- 会更快的内存对象。如果您打算这样做,您可以考虑并行或在单独的任务中进行。