【问题标题】:Take 1 inside GroupBy in Linq [duplicate]在 Linq 的 GroupBy 中取 1 [重复]
【发布时间】:2014-02-26 18:22:03
【问题描述】:

我有一个返回许多记录的查询。

例如:

  • 日期为 2 月 26 日,然后返回该日期的 10 条记录。
  • 日期为 2 月 27 日,然后返回该日期的 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 条记录。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您在问题本身中给出了答案,分组,然后选择第一个。 从技术上讲,您可以将其转换为 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();
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多