我有一些查询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次。
答案 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()
没有意义: