【问题标题】:Slow LINQ Query慢速 LINQ 查询
【发布时间】:2011-01-18 22:25:25
【问题描述】:

我有一个运行缓慢的查询(在大约 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();

【问题讨论】:

    标签: linq performance linq-to-objects


    【解决方案1】:

    第一个停靠港:使用&amp;&amp; 代替&amp;|| 代替|。否则 所有 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 的哈希,因此它可以快速查找每个时间表的可能匹配项。

    【讨论】:

    • 首先,谢谢乔恩!我之前把它短路了,但没有注意到有什么不同。使用“join”而不是“where”确实有效!我从来不知道 LINQ 以不同的方式对待这 2 个。其次——哇!我觉得我刚刚得到了名人的帮助! :) 我从未读过你的书,但看过很多次。不过你可以肯定我现在会去拿一份。 :) 附:如果您正在寻找开发人员,请告诉我!即共同创作您的下一本书!哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多