在Linq的GroupBy中取1

时间:2014-02-26 10:03:53

标签: c# linq

我有一个返回大量记录的查询。

例如:

  • 日期为26-Feb,然后返回此日期的10条记录。
  • 日期是27-Feb,然后返回此日期的15条记录。

Click to See Records

我使用了以下查询:

 var sData = vehicle.GsmDeviceLogs
                    .Where(gs => gs.Speed > zeroSpeed && !gs.DigitalInputLevel1)
                    .OrderBy(gs => gs.DateTimeOfLog)
                    .ToList();

现在,我只想获取每个日期的第一条记录。即。

  • 日期是2月26日 - 1记录。
  • 日期是2月27日 - 1记录。

2 个答案:

答案 0 :(得分:7)

你在问题​​中给出了答案,分组然后选择第一个。 从技术上讲,您可以将其翻译为linq,如下所示:

var sData = vehicle.GsmDeviceLogs
              .Where(gs => gs.Speed > zeroSpeed && !gs.DigitalInputLevel1)
              .OrderBy(gs => gs.DateTimeOfLog)
              .GroupBy(gs => gs.DateTimeOfLog)
              .Select(gs => gs.First())
              .ToList();

答案 1 :(得分:0)

您应该按DateTimeOfLog.Date(返回仅包含日期部分的DateTime)对记录进行分组,然后通过Select获取每个组中的第一个,如下所示:

var data = logs.Where( ... )
               .GroupBy( l => l.DateTimeOfLog.Date )
               .Select( g => new { Date = g.Key, Log = g.First() } );

(我使用的是匿名类型;您可能更喜欢使用元组,具体取决于您使用该数据的方式)