我希望按周分组我的数据:
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调用此函数。
问题是什么以及如何解决?
答案 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));