Попытка рефакторинга некоторого кода, который недавно стал очень медленным, и я наткнулся на блок кода, который выполняет 5 + секунд для выполнения.
Код состоит из двух операторов:
IEnumerable<int> StudentIds = _entities.Filters
.Where(x => x.TeacherId == Profile.TeacherId.Value && x.StudentId != null)
.Select(x => x.StudentId)
.Distinct<int>();
и
_entities.StudentClassrooms
.Include("ClassroomTerm.Classroom.School.District")
.Include("ClassroomTerm.Teacher.Profile")
.Include("Student")
.Where(x => StudentIds.Contains(x.StudentId)
&& x.ClassroomTerm.IsActive
&& x.ClassroomTerm.Classroom.IsActive
&& x.ClassroomTerm.Classroom.School.IsActive
&& x.ClassroomTerm.Classroom.School.District.IsActive).AsQueryable<StudentClassroom>();
Итак, это немного грязно, но сначала я получаю отдельный список идентификаторов из одной таблицы (фильтры), затем я запрашиваю другую таблицу, используя ее.
Это относительно небольшие таблицы, но это еще 5 + секунд времени запроса.
Я поместил это в LINQPad, и он показал, что сначала выполняет нижний запрос, а затем запускает 1000 "разных" запросов.
По прихоти я изменил код "StudentIds", просто добавив в конец .ToArray(). Это улучшило скорость 1000x... для выполнения одного и того же запроса теперь требуется 100 мс.
Какая сделка? Что я делаю неправильно?