C# Linq到实体组(按周数)

C# Linq到实体组(按周数),c#,asp.net,linq,entity-framework,linq-to-entities,C#,Asp.net,Linq,Entity Framework,Linq To Entities,我正在使用ASP.NET v4.5和linq创建实体 我正在尝试使用下面的代码按周分组我的数据 var groupedByWeek = salesOrdersList .GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek)); 然而,我得到了一个带有错误的“死亡黄屏”: LINQ to Entities无法识别方法“System.DateTime AddDays(Double)”方法,并且无法将此方法转换为存储表达式

我正在使用ASP.NET v4.5和linq创建实体 我正在尝试使用下面的代码按周分组我的数据

var groupedByWeek = salesOrdersList
    .GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek));
然而,我得到了一个带有错误的“死亡黄屏”:


LINQ to Entities无法识别方法“System.DateTime AddDays(Double)”方法,并且无法将此方法转换为存储表达式

理想情况下,我想把

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber);
但生活并不是那么容易

有人知道如何将周数与Linq to实体一起使用吗?

使用方法:


它将把
DATEPART
sql函数调用添加到生成的sql查询中。

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

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

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;
    }
}
每日:

var daily = salesOrdersList.Where(x => (long)(x.DueDate - new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays == (long)(Datetime.Now.ToLocalTime()- new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays ).ToList();

每周:

var weekly = salesOrdersList.Where(x => (long)(x.DueDate - new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7 == (long)(Datetime.Now.ToLocalTime()- new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7).ToList();
月刊

var monthly= salesOrdersList.Where(x => x.DueDate.Month== Datetime.Now.ToLocalTime().Month).ToList();

它有什么问题?LINQ to Entities无法识别“System.DateTime AddDays(Double)”方法,并且无法将此方法转换为存储表达式。如果将其更改为
i=>i.DueDate-TimeSpan.FromDays(i.DueDayOfWeek)
i=>i.DueDayOfWeek-new TimeSpan(i.DueDayOfWeek,0,0),会发生什么情况
?system.DayOfWeek不可分配给参数类型DoubleMeh。。。在这种情况下,请尝试Marcin的答案。嗯,我喜欢这个解决方案,但我得到了以下错误:r System.NotSupportedException:LINQ to Entities无法识别“System.DateTime StartOfWeek(System.DateTime,System.DayOfWeek)”方法,并且此方法无法转换为存储表达式。是的,您是对的。我认为解决这个问题的方法是使用
SqlFunctions
比如@MarcinJuraszek的解决方案:
var-groupedByWeek=saleorderslist.GroupBy(I=>SqlFunctions.DatePart(“week”,I.DueDate))因为此函数可以转换为常规SQL代码
SELECT*fromtgroupbydatepart(wk,T.Date)
var daily = salesOrdersList.Where(x => x.DueDate.Day == Datetime.Now.ToLocalTime().Day).ToList();
var weekly = salesOrdersList.Where(x => (long)(x.DueDate - new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7 == (long)(Datetime.Now.ToLocalTime()- new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7).ToList();
var monthly= salesOrdersList.Where(x => x.DueDate.Month== Datetime.Now.ToLocalTime().Month).ToList();