试图重构一些最近变得非常慢的代码,我遇到了一个需要 5 秒以上才能执行的代码块。
代码由 2 个语句组成:
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>();
所以它有点乱,但首先我从一个表(过滤器)中得到一个不同的 Id 列表,然后我使用它查询另一个表。
这些是相对较小的表,但仍然需要 5 秒以上的查询时间。
我把它放在 LINQPad 中,它表明它首先执行底部查询,然后运行 1000 个“不同”查询。
一时兴起,我通过在末尾添加 .ToArray() 更改了“StudentIds”代码。这将速度提高了 1000 倍……现在完成相同的查询需要 100 毫秒。
这是怎么回事?我究竟做错了什么?