Linq简单的查询改进

时间:2017-12-13 12:33:04

标签: c# entity-framework linq

我是Linq查询的初学者,我想知道我的查询是否可以通过另一种方式改进:

long vehid = json.VehicleId.Value;
DateTime date = DateTime.Parse(json.date.Value);

var Alerts = (from t2 in entities.Alerts.AsNoTracking()
              where 
                 t2.GeneratedTimeLocal.Year == date.Year
              && t2.GeneratedTimeLocal.Month == date.Month
              && t2.GeneratedTimeLocal.Day == date.Day
              && (t2.AlertType == 2 || t2.AlertType == 3)
              && t2.vId == vid
              select new
              {
                  GeneratedTimeLocal = t2.GeneratedTimeLocal,
                  OptionalText = t2.OptionalText
              });

return Alerts;

问题在于,Alerts数据表中包含大量数据,这些数据日益增加,现在它的速度很慢。 Alerts datatable中的GeneratedTimeLocal字段是datetimeoffset(7)类型。 有没有办法改进这个查询?

1 个答案:

答案 0 :(得分:3)

定义日期范围以改进查询。然后检查查询执行计划,并根据该计划确定是否需要新索引或更改现有索引。

long vehid = json.VehicleId.Value;
DateTime dateFrom = DateTime.Parse(json.date.Value).Date; // date with no time
DateTime dateTo = dateFrom.AddDays(1); // add one day to create the date range

var Alerts = (from t2 in entities.Alerts.AsNoTracking()
              where 
                 t2.GeneratedTimeLocal >= dateFrom 
              && t2.GeneratedTimeLocal <= dateTo
              && (t2.AlertType == 2 || t2.AlertType == 3)
              && t2.vId == vid
              select new
              {
                  GeneratedTimeLocal = t2.GeneratedTimeLocal,
                  OptionalText = t2.OptionalText
              });

return Alerts;

另一方面,请记住,在执行ToList()之前,此查询不会被执行。

试试这个索引:

CREATE INDEX IX_Alert_GeneratedTimeLocal_vId_AlertType_with_include ON Alert(GeneratedTimeLocal,vId,AlertType)INCLUDE(OptionalText)

我假设您正在使用SQL Server。如果表格很大,您也可以尝试过滤索引。查看此链接:https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-filtered-indexes