慢的LINQ查询

6
我有一个查询在循环中运行缓慢(循环大约100次需要5-10秒),但是我不知道为什么。查询只是针对一个对象列表...非常感谢您的帮助!
基本上,我正在查询被分配给特定经理的计划。它必须来自指定班次的周OR下周的前两天OR上周的最后两天。
我尝试过之前计算.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();
1个回答

7

首要之选:使用 && 而不是 &,使用 || 而不是 |。否则,在 where 子句中的所有子表达式都将被计算,即使答案已知。

其次之选:使用连接代替带有 where 的两个“from”子句:

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

基本上,这将创建所有班次ID的哈希值,因此它可以快速查找每个时间表的可能匹配项。

首先,感谢Jon!之前我曾经让它短路了,但是没有注意到区别。不过使用“join”而不是“where”确实起作用了!我从来不知道LINQ会把这两个区分对待。其次 - 哇!感觉就像得到了名人的帮助!:)我从未读过你的书,但已经看过很多次了。你可以肯定我现在会去买一本了。:)附言:如果你正在寻找开发者,请告诉我!例如,共同撰写你的下一本书!哈哈 - jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接