实体框架Lambda优化

时间:2014-07-24 18:59:05

标签: c# sql linq entity-framework lambda

我有一些查询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次。

1 个答案:

答案 0 :(得分:6)

这是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 ...

如果您的排序规则是Case-Insensitive(以下示例是Sql-server),则使用.ToLower()没有意义:

enter image description here