【问题标题】:Linq to Entities group by week numberLinq to Entity 按周数分组
【发布时间】:2013-04-12 10:36:56
【问题描述】:

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

【问题讨论】:

  • 它有什么问题?
  • LINQ to Entities 无法识别方法 'System.DateTime AddDays(Double)' 方法,并且该方法无法转换为存储表达式。
  • 如果将其更改为i => i.DueDate - TimeSpan.FromDays(i.DueDate.DayOfWeek)i => i.DueDate - new TimeSpan(i.DueDate.DayOfWeek, 0, 0, 0) 会怎样?
  • system.DayOfWeek 不可分配给参数类型 Double
  • 嗯...在这种情况下,请尝试 Marcin 的答案。

标签: c# asp.net linq entity-framework linq-to-entities


【解决方案1】:

使用SqlFunctions.DatePart()方法:

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

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

【讨论】:

    【解决方案2】:

    每日:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嗯我喜欢这个解决方案,但我得到这个 err:r System.NotSupportedException: LINQ to Entities does not identify the method 'System.DateTime StartOfWeek(System.DateTime, System.DayOfWeek)' 方法,并且此方法无法转换为商店表达式。
      • 是的,你是对的。我认为解决方案是使用SqlFunctions 就像@MarcinJuraszek 的解决方案:var groupedByWeek = salesOrdersList.GroupBy(i =&gt; SqlFunctions.DatePart("week", i.DueDate)); 因为这个函数可以转换成这个常规的SQL 代码SELECT * From T GROUP BY DATEPART(wk, T.Date)
      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多