linq - 缓慢的 LINQ 查询

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

最佳答案

第一个停靠港:使用 &&而不是 &||而不是 | .否则 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 的散列,因此它可以快速查找每个时间表的可能匹配项。

关于linq - 缓慢的 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4729755/

相关文章:

c# - 在 Entity Framework C# 中返回列表的最大列表

c# - 我怎样才能加快这个页面的速度?

c# - 在 Entity Framework 中排除所有(启用延迟加载)

c# - 如何返回以特定字符开头和结尾的所有单词?

c# - 如何从 IEnumerable<DirectoryInfo> 中排除目录

c# - 在对象数组中查找

c# - 文本框自动完成 - Winform + LINQ

asp.net - 可以在 ASP.NET 数据绑定(bind)表达式中使用 LINQ 扩展方法运算符吗?

插入更新删除时,通过 ODBC 到 MS Access 的 mysql 链接表表现不佳

c# - 根据列和某个对象的字段检查 SQL 表中是否存在对象