【问题标题】:Entity Framework Lambda Optimization实体框架 Lambda 优化
【发布时间】:2014-09-16 11:44:18
【问题描述】:

我有一些查询 EF 实体的代码,它需要 1.5-1.7 秒。我不应该使用 linq 或 lambda 来产生这些计算吗?也许是一个观点?或者,如果有人可以提供更有效的解决方案,我将不胜感激!当我在 MVC 视图中引用 CurrentMonthBookedDollars 时,会发生很大的延迟:

string[] IgnoreBDOs = { "", ".", ",", "00", "092", "120", "zz", "zzz", "zzzz", "yyy" };

IQueryable<LOAN> Production
{
    get
    {
        return Db.LOAN.Where(n => IgnoreBDOs.Contains(n.TEAM.BDO.ToLower()) == false
        && n.LOAN_TYPE.Length > 0);
    }
}

public decimal CurrentMonthBookedDollars
{
    get
    {
        return Production
        .Where(p => p.WORKFLOW.NOTE_DATE.HasValue
            && p.WORKFLOW.NOTE_DATE.Value.Year == DateTime.Today.Year
            && p.WORKFLOW.NOTE_DATE.Value.Month == DateTime.Today.Month)
        .Select(p => p.LOAN_AMT ?? 0)
        .DefaultIfEmpty()
        .Sum(amt => amt);
    }
}

*编辑:当我在 SQL 数据库上运行分析器时,我还想提到 CurrentMonthBookedDollars 结果为 39,576 次读取。

【问题讨论】:

  • 您的替代方案是什么?你有没有试过,看看它是否会更快?
  • 在 SSMS 中重新运行查询并开启 Include Actual Execution Path 并查看是否可以进行 SQL 优化(例如添加索引)。

标签: c# sql linq entity-framework lambda


【解决方案1】:

这是一个non-sargable 查询,因为:

    .Where(p => p.WORKFLOW.NOTE_DATE.HasValue
        && p.WORKFLOW.NOTE_DATE.Value.Year == DateTime.Today.Year
        && p.WORKFLOW.NOTE_DATE.Value.Month == DateTime.Today.Month)

你应该使用:

var start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var end = start.AddMonth(1);

    .Where(p => p.WORKFLOW.NOTE_DATE.HasValue
        && p.WORKFLOW.NOTE_DATE.Value >= start
        && p.WORKFLOW.NOTE_DATE.Value < end)

根据数据库的定义方式(排序规则类型),以下内容可能也是不可分割的,也可能不是必需的:

Db.LOAN.Where(n => IgnoreBDOs.Contains(n.TEAM.BDO.ToLower()) == false ...

如果您的排序规则不区分大小写(以下示例是 Sql-server),那么使用 .ToLower() 没有意义:

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多