问题
I am using ASP.NET v4.5 and linq to entities I am trying to group my data by week using the below code
var groupedByWeek = salesOrdersList
.GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek));
However I am getting a "yellow screen of death" with the error:
LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
Ideally I would like to put
var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber);
But life isn't that easy!
Does anyone know a way of using week numbers with Linq to Entities?
回答1:
Use SqlFunctions.DatePart() method:
var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate));
It will add DATEPART
sql function call into generated SQL query.
回答2:
Or you can get the date of the first day in the week then group by that date.
To get the date of the first day in the week. you can use this code:
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;
}
}
then you can group by the first date of the week like this:
var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.StartOfWeek(DayOfWeek.Monday));
来源:https://stackoverflow.com/questions/15969174/linq-to-entities-group-by-week-number