我有一段使用IQueryable根据日期选择的代码。这里的sql性能导致超时。如果这是直接的SQL,我会使用(OPTIMIZE FOR(@date UNKNOWN)。但是,使用
DateTime now = DateTime.UTC Now;
var results = from item in items.Find()
where item.startDate <= now
where item.endDate > now
select item;
return results;
有没有一个好方法来添加这个提示?或者我应该将其作为存储过程移动到数据库?
答案 0 :(得分:1)
我没有看到提示如何帮助您提高性能。您应首先获得正确的查询,并在SQL事件探查器上查看由Entity Framework生成的SQL。如果您的数据库按我预期的那样设计,则以下代码段应该会提供不错的性能。
var results = item.Where(x=> x.startDate <= now && x.endDate > now)
在sql server上查看关于索引提示的相关问题,总结一下,不能和linq一起使用。
答案 1 :(得分:1)
假设:Find()
返回IQueryable
,startDate
和endDate
上有索引
我不知道向Linq添加查询提示的方法,因为它们是提供者特定的,但您可以尝试一些事情:
使用&&
代替多个where
子句:
DateTime now = DateTime.UTCNow;
var results = from item in items.Find()
where item.startDate <= now
&& item.endDate > now
select item;
通过ExecuteStoreQuery
执行直接SQL:
string sql = @"SELECT * FORM Items " +
"WHERE startDate <= @asOf
" AND endDate > @asOf"
var results = db.ExecuteStoreQuery<Item>(sql, new [] {now});