首页 > 解决方案 > LINQ:选择表中每分钟的第一个值

问题描述

我有这样的对象列表:

+-------------+------------+---------------------+
| ID          | Value      | Snapshot            | 
+-------------+------------+---------------------+
| 1           | 1          | 2019-03-07 20:00:04 |
| 2           | 2          | 2019-03-07 20:01:15 |
| 3           | 1          | 2019-03-07 20:01:23 |
| 4           | 3          | 2019-03-07 20:01:45 |
| 5           | 5          | 2019-03-07 20:02:10 |
| 6           | 7          | 2019-03-07 20:02:45 |
| 7           | 1          | 2019-03-07 20:03:10 |
| 8           | 0          | 2019-03-07 20:04:30 |
+-------------+------------+---------------------+

如何仅从每分钟或每小时中选择记录...

结果应该是这样的:

+-------------+------------+---------------------+
| ID          | Value      | Snapshot            | 
+-------------+------------+---------------------+
| 1           | 1          | 2019-03-07 20:00:04 |
| 2           | 2          | 2019-03-07 20:01:15 |  
| 5           | 5          | 2019-03-07 20:02:10 |
| 7           | 1          | 2019-03-07 20:03:10 |
| 8           | 0          | 2019-03-07 20:04:30 |
+-------------+------------+---------------------+

在我使用 thisq SQL 查询获取这些记录的那一刻:

SELECT * FROM log 
WHERE Snapshot IN ( SELECT MIN(Snapshot) AS snaptime FROM log GROUP BY DATE_FORMAT(snaptime,'%Y-%m-%d %H:%i'))

但如果可能的话,我需要以某种方式将此查询转换为 LINQ。

标签: c#linq

解决方案


所以你想按分钟分组并只显示每分钟的第一条记录:

var query = list
    .OrderBy(x => x.Snapshot)
    .GroupBy(x => x.Snapshot.Date.AddMinutes((int)x.Snapshot.TimeOfDay.TotalMinutes))
    .Select(minuteGroup => minuteGroup.First());

推荐阅读