在Linq to SQL中按周(按周数)分组

ari*_*iel 5 c# vb.net sql-server week-number linq-to-sql

在常规SQL中我可以做类似的事情

SELECT * From T GROUP BY DATEPART(wk, T.Date)
Run Code Online (Sandbox Code Playgroud)

我怎么能在Linq to SQL中做到这一点?

以下不起作用

From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
Run Code Online (Sandbox Code Playgroud)

也不工作:

From F In DB.T Group R By (F.Date.DayOfYear / 7)
Run Code Online (Sandbox Code Playgroud)

Gre*_*ray 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()
        };
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

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
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这不会直接对应于日历周,因为它假设年份始终在星期日开始.要完全匹配,您需要使用Calendar.WeekOfYear或将DatePart调用包装到SQL函数中 (2认同)