我有一个查询:
(from sr in ctx.STARS_Route
where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
select sr.DistrictRouteNumber).Distinct();
在 LinqPad 中,查询的运行时间大约为 0.3 秒。STARS_RouteStopDestination 表中大约有 800K 条记录,但平均返回大约 30-90 条记录。
实际上,从该查询返回结果的方法需要 4 多秒!这没有任何意义。
我唯一能想到的是 .Any 子句花费了很多时间,但 LinqPad 说查询很快。我设置了一个测试(请原谅名称):
using (STARSEntities ctx = new STARSEntities())
{
var Original = (from sr in ctx.STARS_Route
where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
select sr.DistrictRouteNumber).Distinct();
var Entity = (from rsd in ctx.STARS_RouteStopDestination
where rsd.STARS_DistrictRoute.DistrictId == districtId
&& rsd.IsWorkingSet == true
select rsd.STARS_Route.DistrictRouteNumber).Distinct();
DateTime startOriginal = DateTime.Now;
routes = Original.ToList();
Debug.WriteLine("Original took: " + (DateTime.Now - startOriginal).ToString());
DateTime startEtity = DateTime.Now;
routes = Entity.ToList();
Debug.WriteLine("Entity took: " + (DateTime.Now - startEtity).ToString());
}
输出让我大吃一惊:
原始拍摄:00:00:04.0270000
实体拍摄:00:00:00.0200000
为什么带有 .Any 子句的查询需要更长的时间才能运行,为什么 LinqPad 会说原始查询比针对同一数据集的实体查询运行得稍快一些?