【问题标题】:C# LINQ get records from datatable group by hourC# LINQ 按小时从数据表组中获取记录
【发布时间】:2015-04-17 21:21:33
【问题描述】:

我有一个数据表,其列是名称、代码、日期和时间。现在我想使用 LINQ 获取一天中每小时的所有记录数。

DateTime 列包含的数据为

2014-08-01 07:00:06.163
2014-08-01 07:00:11.873
2014-08-01 07:00:42.623
2014-08-01 07:00:48.363
2014-08-01 07:01:15.243
2014-08-01 07:01:16.507

现在我想按小时计算从一天开始到一天结束的所有记录数。

例如:

7 O Clock : 56 Records
8 O Clock : 90 Records
..
..
etc.

如何通过 LINQ 实现?

【问题讨论】:

  • 可以。但是你尝试过什么?哪一部分你不知道/不工作?
  • 如果两条记录在不同的日子,但在同一小时,你想将它们相加还是分开计算?

标签: c# linq


【解决方案1】:

如果您的列类型是 DateTime,那么您可以按其 Hour 属性分组并获取每小时的计数,例如:

var query = dt.AsEnumerable()
    .GroupBy(row => row.Field<DateTime>("dateAndTime").Hour)
    .Select(grp => new
    {
        Hour = grp.Key,
        Count = grp.Count()
    });

dt 是你的DataTable

编辑:只要您的DataTable 中有单个日期的数据,上述内容就应该有效,但是如果您有多个日期的行,则应该在DateHour 上进行分组,例如:

var query = dt.AsEnumerable()
    .GroupBy(row => new
    {
        Date = row.Field<DateTime>("dateAndTime").Date, 
        Hour = row.Field<DateTime>("dateAndTime").Hour
    })
    .Select(grp => new
    {
        Date = grp.Key.Date,
        Hour = grp.Key.Hour,
        Count = grp.Count()
    });

【讨论】:

  • 这会将天组合在一起。您还应该按 dateTime.Date 分组。问题写得不好,但我认为这一行描述了“从一天开始到一天结束”的这一要求
  • @Pluc,你说得对,我应该修改一下,从数据来看,似乎有一天的日期。
  • 我的一天从 7 点开始。因此,应该是 7 到 7。稍后 7 将下降到下一个日期。
  • “asEnumerable”不是要从 db 中提取所有数据,然后使用列表上的 linq 查询对其进行分组吗?如果是这样,你应该在最后做。
【解决方案2】:

我假设该列确实存储了DateTimes,您可以按Date + Hour分组:

 var hourGroups = dataTable.AsEnumerable()
    .Select(row => new { DateAndTime = row.Field<DateTime>("dateAndTime"), Row = row })
    .GroupBy(x => new { Date = x.DateAndTime.Date, Hour = x.DateAndTime.Date.Hour });

foreach (var x in hourGroups)
    Console.WriteLine("Date: {0} Hour: {1}: Count: {2} All names: {3}", 
        x.Key.Date.ToShortDateString(),
        x.Key.Hour,
        x.Count(),
        string.Join(",", x.Select(xx => xx.Row.Field<string>("name")))); // just bonus

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2018-06-24
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多