2011-01-18 8 views
6

Tengo una consulta que se está ejecutando lentamente (en un bucle de aproximadamente 100 tarda de 5 a 10 segundos) y no tengo ni idea de por qué. Simplemente se trata de consultar una Lista de objetos ... ¡tu ayuda es muy apreciada!Slow LINQ Query

Básicamente estoy preguntando por los horarios que se han asignado a los administradores específicos. Debe ser desde la semana de turnos especificada O los primeros 2 días de la semana siguiente O los 2 últimos días de la semana anterior.

Intenté calcular .AddDays antes, pero eso no ayudó. Cuando ejecuté una prueba de rendimiento, destacó la declaración "de" a continuación.

List<Schedule> _schedule = Schedule.GetAll(); 
List<Shift> _shifts = Shift.GetAll(); 

// Then later... 
List<Schedule> filteredSchedule = (from sch in _schedule 
            from s in _shifts 
            where 
             **sch.ShiftID == s.ShiftID 
             & (sch.ManagerID == 1 | sch.ManagerID == 2 | sch.ManagerID == 3) 
             & ((s.ScheduleWeek == shift.ScheduleWeek) 
               | (s.ScheduleWeek == shift.ScheduleWeek.AddDays(7) 
                 & (s.DayOfWeek == 1 | s.Code == 2)) 
               | (sch.ScheduleWeek == shift.ScheduleWeek.AddDays(-7) 
                 & (s.DayOfWeek == 5 | s.Code == 6)))** 
            select sch) 
            .OrderBy(sch => sch.ScheduleWeek) 
            .ThenBy(sch => sch.DayOfWeek) 
            .ToList(); 

Respuesta

7

primer puerto de escala: utilizar && en lugar de & y || en lugar de |. De lo contrario, todos se evaluarán las subexpresiones en la cláusula where, incluso si la respuesta ya se conoce.

segundo puerto de escala: utilizar una combinación en lugar de dos "de" cláusulas con un donde:

var filteredSchedule = (from sch in _schedule 
         join s in _shifts on s.ShiftID equals sch.ShiftID 
         where ... rest of the condition ... 

Básicamente eso va a crear un hash de todos los identificadores de cambio, por lo que rápidamente se puede mirar hacia arriba posible coincidencias para cada programa.

+0

En primer lugar, gracias Jon! Lo tuve en cortocircuito antes, pero no noté la diferencia. Sin embargo, ¡el uso de "join" en vez de "where" funcionó! Nunca supe que LINQ trató el 2 de manera diferente. En segundo lugar - ¡guau! ¡Siento que acabo de recibir ayuda de una celebridad! :) Nunca leí tu libro, pero lo he visto muchas veces. Sin embargo, puedes estar seguro de que voy a recoger una copia ahora. :) p.s. si alguna vez buscas un desarrollador, ¡házmelo saber! es decir, ¡coautor de su próximo libro! jaja – jon