Linq - 按周排列

时间:2017-05-17 09:34:46

标签: 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(),
                ...
            });

但是我收到了这个错误:

  

只能从LINQ to Entities调用此函数。

问题是什么以及如何解决?

2 个答案:

答案 0 :(得分:9)

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

stats.GroupBy(i => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
    i.date, CalendarWeekRule.FirstDay, DayOfWeek.Monday));

注意所使用的文化以及GetWeekOfYear的参数(计算为一年中的第一周以及计为一周的第一天)。

答案 1 :(得分:2)

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

获取一周中第一天的日期。 你可以使用这段代码:

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;
    }
}

然后你可以按照这样的第一个星期分组:

stats.GroupBy(i => i.date.StartOfWeek(DayOfWeek.Monday));