8

我正在使用 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 Entity 中使用周数的方法?

4

3 回答 3

17

使用SqlFunctions.DatePart()方法:

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

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

于 2013-04-12T11:03:01.457 回答
1

每日:

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();
于 2020-03-03T09:52:28.850 回答
0

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

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

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));
于 2017-07-11T16:46:25.047 回答