6

在常规 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)
4

6 回答 6

8

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
于 2010-08-06T22:16:03.490 回答
2

您可以使用System.Data.Entity.SqlServerSqlFunctions.DatePart命名空间中的方法。

// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)
于 2018-12-06T10:00:53.737 回答
1

这可以正常工作。

from F in DB.T group F by F.Date.DayOfYear / 7;

您错误地指定了组。此代码的结果是对象的集合。每个对象都将有一个 Key 属性,该属性将是您分组的依据(在这种情况下是F.Date.DayOfYear / 7. 每个对象的结果),每个对象都是 T 中满足分组条件的对象的集合。

于 2010-08-06T21:30:58.307 回答
1

范围变量名称只能从不带参数的简单名称或限定名称中推断出来

于 2010-08-06T21:33:32.750 回答
0

如果您担心您在以下代码中的文化,则会考虑到这一点:

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;
于 2010-08-06T21:35:46.630 回答
0

首先,您应该获得一周中第一天的日期。

获取一周中第一天的日期。您可以使用以下代码:

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));
于 2017-07-11T16:33:30.957 回答