Linq to Entities 按周数分组

Linq to Entities group by week number

提问人:Gordon Copestake 提问时间:4/12/2013 最后编辑:qujckGordon Copestake 更新时间:3/3/2020 访问量:8209

问:

我正在使用 ASP.NET v4.5 和 linq to entities 我正在尝试使用以下代码按周对我的数据进行分组

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 Entities 中使用周数的方法?

C# asp.net 实体框架 LINQ-to-Entities

评论

0赞 Daniel Hilgarth 4/12/2013
它有什么问题?
0赞 Gordon Copestake 4/12/2013
LINQ to Entities 无法识别方法“System.DateTime AddDays(Double)”方法,并且此方法无法转换为存储表达式。
0赞 Daniel Hilgarth 4/12/2013
如果将其更改为 or 会发生什么?i => i.DueDate - TimeSpan.FromDays(i.DueDate.DayOfWeek)i => i.DueDate - new TimeSpan(i.DueDate.DayOfWeek, 0, 0, 0)
0赞 Gordon Copestake 4/12/2013
系统。DayOfWeek 不能分配给参数类型 Double
1赞 Daniel Hilgarth 4/12/2013
呵呵......在这种情况下,请尝试 Marcin 的答案。

答:

19赞 MarcinJuraszek 4/12/2013 #1

使用 SqlFunctions.DatePart() 方法:

var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate));

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

1赞 hoss77 7/12/2017 #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;
    }
}

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

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.StartOfWeek(DayOfWeek.Monday));

评论

0赞 Rodney 8/29/2017
嗯,我喜欢这个解决方案,但我得到这个错误:r System.NotSupportedException:LINQ to Entities 无法识别方法“System.DateTime StartOfWeek(System.DateTime, System.DayOfWeek)”方法,并且此方法无法转换为存储表达式。
0赞 hoss77 9/7/2017
是的,你是对的。我认为解决方案是使用 Like @MarcinJuraszek的解决方案:因为这个函数可以转换为这个常规的 SQL 代码SqlFunctionsvar groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate));SELECT * From T GROUP BY DATEPART(wk, T.Date)
2赞 Enver Yumrutas 3/3/2020 #3

每日:

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 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();