2011-01-18 129 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