Имам запитване:
(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 секунди. Има приблизително 800K записа в таблицата STARS_RouteStopDestination, но средната възвръщаемост е около 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 би казал, че оригиналната заявка се изпълнява малко по-бързо от заявката Entity срещу същия набор от данни?
StopWatch
в System.Diagnostics за измерване на времето за изпълнение вместо DateTime. - person Diego Torres   schedule 05.04.2011