2011-01-18 102 views
6

我有一个查询运行缓慢(在约100循环中需要5-10秒),并不知道为什么。它只是查询对象列表...您的帮助非常感谢!缓慢的LINQ查询

我基本上是查询已分配给特定经理的时间表。它必须来自指定的周转周或下周的前2天或前一周的最后2天。

我试着计算.AddDays之前,但没有帮助。当我运行性能测试时,突出显示了下面的“from”语句。通话

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(); 

回答

7

第一个端口:使用&&代替&||而不是|。否则全部where子句中的子表达式将被评估,即使答案已知。

通话的第二口:用“从”条款的联接,而不是两个具有其中:

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

基本上那将创造一切移位ID的哈希值,所以它可以快速查找可能的匹配每个时间表。

+0

首先,谢谢乔恩!之前我有过短路但没有注意到差异。使用“加入”而不是“在哪里”虽然工作!我从来不知道LINQ对待2的方式不同。 其次 - 哇!我觉得我刚刚得到名人的帮助! :)我从来没有读过你的书,但看过很多次。不过,你可以确定我现在会收到一份副本。 :) p.s.如果您曾经在寻找一名开发人员,请告诉我!即合着你的下一本书!哈哈 – jon 2011-01-19 14:55:39