C#LINQ按小时从数据表组中获取记录

时间:2015-04-17 13:05:05

标签: c# linq

我有一个数据表,其列是name,code,dateAndTime。现在,我希望使用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实现?

2 个答案:

答案 0 :(得分:9)

如果您的列类型为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中单个日期的数据,上述内容就可以正常运行,但如果您有多个日期的行,则应在Date以及{进行分组{1}}喜欢:

Hour

答案 1 :(得分:4)

我认为该列确实存储了DateTime,您可以按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