LINQ查询返回MAX日期,其中该周的所有日子都符合特定条件



不知道如何最好地解释这一点,所以请耐心等待…

我正在写一个自动生成员工轮值表的应用程序。

我有一张表(tl_RotaDays),它本质上是一个日历,记录了哪位工作人员在特定的一天待命——例如

Date           Login
---------------------------
02-01-2012     Bob
03-01-2012     Bob 
04-01-2012     Bob 
05-01-2012     Bob 
06-01-2012     Bob 
09-01-2012     Bob 
10-01-2012     Bob 
11-01-2012     Bob 
12-01-2012     Sue 
13-01-2012     Sue 

我想返回每个人上一个"完整"工作周(周一至周五)的周五日期,基于"完整"周定义为他们工作>=3天的一周。

因此,在上例中,对"Bob"的查询应返回"13-01-2012",因为他在该周的大部分时间都在工作,即使Sue在周末也在工作。

我有一个查询,可以得到每个人最后工作的日期:

lastEveningOOH = Convert.ToDateTime((from rd in db.tl_rotaDays
                                where rd.ooh == tc.login && ((int)Convert.ToDateTime(rd.date).DayOfWeek >= 1 &&
                                            (int)Convert.ToDateTime(rd.date).DayOfWeek <= 5)
                                select rd.date).Max()),

但是,我唯一能想到的检查此人是否工作了"整整"一周的方法是根据每一行查询原始表格,这似乎效率非常低。

如果dt是日期列表,您可以在一个Linq查询中完成,如下所示:

DateTime maxWeek =
            dt.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday).GroupBy(
                d => new GregorianCalendar().GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)).Where(
                    g => g.Count() > 2).OrderBy(g => g.Key).Last().Max();

如果目的是优化SQL查询,您可以在这里检查Linq2Sql生成的内容,看看简单的算法方法(查看最长日期=>查看是否完整周=>查看最长时间-7等)是否效果最佳。此外,如果日期跨越多年,上述Linq查询可能会不正确,但可以修改分组来纠正这一点。

最新更新