У меня есть запрос:
(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 примерно 800 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 записей.
На практике метод, возвращающий результаты этого запроса, занимал 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