Tratando de refactorizar un código que se ha vuelto realmente lento recientemente y encontré un bloque de código que está tardando más de 5 segundos en ejecutarse.Entity Framework + LINQ + "Contiene" == Súper lento?
El código consta de 2 estados:
IEnumerable<int> StudentIds = _entities.Filters
.Where(x => x.TeacherId == Profile.TeacherId.Value && x.StudentId != null)
.Select(x => x.StudentId)
.Distinct<int>();
y
_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>();
Así que es un poco desordenado pero primero me sale una lista distinta de la identificación del de una tabla (filtros), entonces yo consulto otra mesa usándolo.
Estas son tablas relativamente pequeñas, pero aún son más de 5 segundos de tiempo de consulta.
Puse esto en LINQPad y mostró que estaba haciendo primero la consulta de abajo y luego ejecutando 1000 consultas "distintas" después.
Por un capricho, cambié el código "StudentIds" simplemente agregando .ToArray() al final. Esto mejoró la velocidad 1000x ... ahora lleva 100ms completar la misma consulta.
¿Cuál es el problema? ¿Qué estoy haciendo mal?
'¿Qué estoy haciendo mal?' Erm ... ¿No está haciendo una matriz de StudentID? :) –
En otras noticias, ¿no es Linqpad una herramienta genial? –
Este es uno de esos casos en los que 'var' hubiera hecho mágicamente que el código fuera más rápido al identificar que StudentIds podría ser IQueryable. –