在常规 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)
在常规 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
您可以使用System.Data.Entity.SqlServerSqlFunctions.DatePart
命名空间中的方法。
// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)
这可以正常工作。
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));