慢LINQ查询

jon*_*jon 6 linq performance linq-to-objects

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

我基本上是在查询已分配给特定经理的计划表.它必须来自指定的移位周或下周的前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();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

第一个停靠港:使用&&代替&||代替的|.否则,即使答案已知,也将评估该子句中的所有子表达式where.

第二个停靠点:使用连接而不是两个"from"子句,其中:

var filteredSchedule = (from sch in _schedule
                        join s in _shifts on s.ShiftID equals sch.ShiftID
                        where ... rest of the condition ...
Run Code Online (Sandbox Code Playgroud)

基本上,这将创建所有班次ID的哈希,因此它可以快速查找每个计划的可能匹配.