不知道如何最好地解释这一点,所以请耐心等待…
我正在写一个自动生成员工轮值表的应用程序。
我有一张表(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查询可能会不正确,但可以修改分组来纠正这一点。