我的查询运行缓慢(在大约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();
答案 0 :(得分:7)
第一个停靠点:使用&&
代替&
和||
代替|
。否则, all 将评估where
子句中的子表达式,即使答案已知。
第二个停靠点:使用连接而不是两个“from”子句,其中where:
var filteredSchedule = (from sch in _schedule
join s in _shifts on s.ShiftID equals sch.ShiftID
where ... rest of the condition ...
基本上,这将创建所有班次ID的哈希值,因此它可以快速查找每个时间表的可能的匹配。