实体框架Lambda优化

Don*_*ett 3 c# sql linq lambda entity-framework

我有一些代码查询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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ips 6

这是一个不可搜索的查询,因为:

    .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)
Run Code Online (Sandbox Code Playgroud)

相反,你应该使用:

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)
Run Code Online (Sandbox Code Playgroud)

根据数据库的定义方式(排序规则类型),以下内容可能既不可更改也不必要:

Db.LOAN.Where(n => IgnoreBDOs.Contains(n.TEAM.BDO.ToLower()) == false ...
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述