【问题标题】:.NET when grouping records by hour impossible to use datetime in the select.NET 按小时分组记录时无法在选择中使用日期时间
【发布时间】:2016-07-12 18:01:48
【问题描述】:

我正在尝试按小时对记录列表进行分组并存储每小时的记录数。这是我的代码:

        DateTime firstTimeStamp = myRecords.DataBaseRecords.First().TimeStamp;
        Statistics = myRecords.DataBaseRecords
         .GroupBy(x => x.TimeStamp.Hour)
          .Select(group => new GraphModel() { Date =firstTimeStamp.AddHours(group.Key), Value = group.Count() })
        .ToList();

问题是,当我使用 select 功能时,我无法再访问 DateTime,因此字段 group.key 包含一个介于 0 和 24 之间的值。我只需要按小时和每小时对所有记录进行分组,我需要在Value参数中有记录数。

【问题讨论】:

  • 为什么不呢?会发生什么?
  • 它实际上不会返回大于 24 的小时,因此如果例如下一个日期时间在 3 天内,它不会返回 82 小时但会返回 0 :/
  • 您对它有什么期望?当您花费一个小时时,它将返回一个从 0 到 23 的值。日期是一个单独的值。
  • 是的,但如果我确实使用了按小时分组,我无法在选择中获取日期
  • 而不是x.TimeStamp.Hour,使用(int)Math.Truncate(x.TimeStamp.TotalHours)

标签: c# .net linq datetime request


【解决方案1】:

您必须按第一个时间戳的绝对小时数对数据进行分组,即为每个 TimeStamp 值计算的小时数差异:

Statistics = myRecords.DataBaseRecords
                      .GroupBy(x => DbFunctions.DiffHours(firstTimeStamp, x.TimeStamp) into g
                      .Select(g => new GraphModel
                      {
                          Date = g.FirstOrDefault().TimeStamp,
                          Value = g.Count()
                      };

如果这是普通的 LINQ to objects(不是实体框架),您可以替换 ...

DbFunctions.DiffHours(firstTimeStamp, x.TimeStamp)

...通过

(x.TimeStamp - firstTimeStamp).TotalHours

如果是 LINQ to SQL,请使用

SqlMethods.DateDiffHour(firstTimeStamp, x.TimeStamp)

【讨论】:

    【解决方案2】:

    也许这样的事情对你有用:

    DateTime myDateTime = new DateTime(DateTime.Parse(firstTimeStamp).AddHours(group.Key).Ticks);
    

    上面的具体问题:

     ...Date = new DateTime(DateTime.Parse(firstTimeStamp).AddHours(group.Key))...
    

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2014-06-24
      • 2011-10-22
      相关资源
      最近更新 更多