Linq - 按周排列

moh*_*mad 4 c# linq

我希望按周分组我的数据,如下所示:

var result = stats.GroupBy(i => SqlFunctions.DatePart("week", i.date))
            .Select(g => new ReportModel
            {
                clicks = g.Select(x => x.clicks).Sum(),
                impressions = g.Select(x => x.impressions).Sum(),
                ...
            });
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

只能从LINQ到实体调用此函数.

有什么问题,我该如何解决?

Evk*_*Evk 11

SqlFunctions.DatePart(和其他此类函数)不能作为常规方法调用.它只能用作数据库查询的一部分(with IQueryable).所以你必须使用另一种方法,例如:

stats.GroupBy(i => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
    i.date, CalendarWeekRule.FirstDay, DayOfWeek.Monday));
Run Code Online (Sandbox Code Playgroud)

注意所使用的文化以及GetWeekOfYear(一年中的第一周和一周的第一天)的参数.


小智 7

或者您可以获取一周中第一天的日期,然后按该日期分组。

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

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

然后你可以按一周的第一个日期分组,如下所示:

stats.GroupBy(i => i.date.StartOfWeek(DayOfWeek.Monday));
Run Code Online (Sandbox Code Playgroud)