c# - 使用 Entity Framework 优化 LINQ 查询

标签 c# asp.net-mvc linq linq-to-entities

我有以下 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 条记录,查询会很慢。我该如何优化它?

最佳答案

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

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

  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. 将所有计算表与产品表 (var calcTable = db.Calculations.ToList()) 一起提取到内存中可能会更便宜,如果它的记录数量有限,那么 GetCalaculation 将起作用使用内存中的对象会更快。如果您打算这样做,您可以考虑并行或在单独的任务中进行。

关于c# - 使用 Entity Framework 优化 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29933740/

相关文章:

c# - 如何在 MVC 3 Razor View Engine 中使用 C# 显示和隐藏 Div?

asp.net - 渲染多个局部 View 时的验证

c# - 即使在 WPF 中打开新窗口,也会更新主窗口的属性

c# - Cookie 过期未按预期工作

c# - ASP.NET/MVC : Inline code

c# - 类型 'System.String[]' 不支持比较运算符

c# - 当结果为空时 LINQ 返回什么

c# - LINQ 检查一个列表是否包含另一个列表中的任何项目 mysql 语法错误

c# - 按字段分组

c# - 原始痴迷 - 具有自动增量的强类型 int ID