按Linq to SQL中的每周(周数)分组
在常规SQL中我可以做类似的事情
SELECT * From T GROUP BY DATEPART(wk, T.Date)
我怎么能在Linq to SQL中做到这一点?
以下不起作用
From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
也不工作:
From F In DB.T Group R By (F.Date.DayOfYear / 7)
范围变量名只能从不带参数的简单或限定名称推断
LINQ to SQL不支持Calendar.WeekOfYear方法,但您可能会创建一个TSQL 函数来包装对DatePart的调用 。 DayOfYear / 7技巧应该适用于大多数情况并且更容易使用。 这是我最终得到的代码:
var x = from F in DB.T group F by new {Year = F.Date.Year, Week = Math.Floor((decimal)F.Date.DayOfYear / 7)} into FGroup orderby FGroup.Key.Year, FGroup.Key.Week select new { Year = FGroup.Key.Year, Week = FGroup.Key.Week, Count = FGroup.Count() };
结果是这样的:
Year Week Count 2004 46 3 2004 47 3 2004 48 3 2004 49 3 2004 50 2 2005 0 1 2005 1 8 2005 2 3 2005 3 1 2005 12 2 2005 13 2
这工作正常。
from F in DB.T group F by F.Date.DayOfYear / 7;
您错误地指定了该组。 此代码的结果是对象的集合。 每个对象都有一个Key属性,它将是你的分组(在这种情况下是F.Date.DayOfYear / 7
的结果。每个对象将是来自T的符合组条件的对象的集合。
如果您关注以下代码中的文化,则会考虑到这一点:
var ci = CultureInfo.CurrentCulture; var cal = ci.Calendar; var rule = ci.DateTimeFormat.CalendarWeekRule; var firstDayOfWeek = ci.DateTimeFormat.FirstDayOfWeek; var groups = from F in DB.T group F by cal.GetWeekOfYear(F, rule, firstDayOfWeek) into R select R;
首先,您应该获得一周中第一天的日期。
获取本周第一天的日期。 你可以使用这段代码:
public static class DateTimeExtensions { public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) { int diff = dt.DayOfWeek - startOfWeek; if (diff < 0) { diff += 7; } return dt.AddDays(-1 * diff).Date; } }
然后,您可以按一周的第一个日期进行分组。
所以常规SQL中的这段代码:
SELECT * From T GROUP BY DATEPART(wk, T.Date)
可以像这样在Linq to SQL中完成
T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));