我有一个应用程序,允许用户输入他们工作所花费的时间,并且我正在尝试构建一些好的报告来利用LINQ to Entities。因为每个TrackedTime
都有一个TargetDate
,它只是DateTime
的"日期"部分,所以相对简单地按用户和日期对时间进行分组(出于简单起见,我忽略了"where"子句):
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate} into ut
select new
{
UserName = ut.Key.UserName,
TargetDate = ut.Key.TargetDate,
Minutes = ut.Sum(t => t.Minutes)
};
感谢
DateTime.Month
属性,按照用户和月份分组只稍微复杂一些:var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate.Month} into ut
select new
{
UserName = ut.Key.UserName,
MonthNumber = ut.Key.Month,
Minutes = ut.Sum(t => t.Minutes)
};
现在进入棘手的部分。有可靠的方法来按周分组吗?我尝试了以下基于这个回答的类似LINQ to SQL问题:
DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days / 7} into ut
select new
{
UserName = ut.Key.UserName,
WeekNumber = ut.Key.WeekNumber,
Minutes = ut.Sum(t => t.Minutes)
};
但是LINQ to Entities似乎不支持DateTime对象的算术运算,所以它不知道如何执行(t.TargetDate - firstDay).Days / 7。
我考虑在数据库中创建一个视图,将天数简单映射到周数,然后将该视图添加到我的Entity Framework上下文中,并在LINQ查询中加入它,但这似乎对于像这样的东西来说太麻烦了。有没有好的解决方法来处理算术方法?有什么适用于Linq to Entities的好方法,我可以在LINQ语句中直接使用而不必触及数据库?有没有一种方法告诉Linq to Entities如何从一个日期中减去另一个日期?
总结:
感谢大家的周到和创造性的回答。经过这一番探讨,看起来这个问题的真正答案是“等到.NET 4.0”。我将把赏金给Noldorin,因为他给出了最实用的答案,同时还利用了LINQ,特别提到Jacob Proffitt发现了一种使用Entity Framework的响应,而无需对数据库进行修改。还有其他很棒的答案,如果你第一次看到这个问题,我强烈建议阅读所有得到投票的答案以及它们的评论。这真的是StackOverflow的力量的一个绝妙的例子。谢谢大家!
GetFirstDayOfFirstWeekOfYear
,我认为您基本上只查询可以假定年份相同的记录。您是否实际上正在查询任意日期,并从指定的任意点(可能是一年的第一天,也可能不是)计算周数?还是仍然只有单年,仅调整以考虑年初的“短周”就足够了? - Pavel MinaevGetFirstDayOfFirstWeekOfYear
是想表明有一个日期,可以从中减去所有其他日期,以确定它们所在的周数。最终,我想将这些周表示为日期范围(7/12/09 - 7/18/09),但我认为这超出了本问题的范围。 - StriplingWarrior