【问题标题】:How to get the MAX row with a GROUP BY?如何使用 GROUP BY 获取 MAX 行?
【发布时间】:2018-07-05 03:49:52
【问题描述】:

我有一个这样构建的 SQL 表:

项目:

Id         ItemId     VersionId
---------- ---------- ----------
1          1          1
2          1          2
3          1          3
4          2          1
5          2          2
6          3          1

现在我想用 linq 选择每个项目的最新版本。预期的输出是:

Id         ItemId     VersionId
---------- ---------- ----------
3          1          3
5          2          2
6          3          1

每个项目都有自己的版本计数,因此制作项目 1 的新版本将为其赋予 VersionId 4,而制作项目 3 的新版本将赋予其 VersionId 2。

到目前为止,我已经尝试选择项目,然后使用 GroupBy:

var query = from i in items
            select i;

var test = query.GroupBy(q => q.ItemId).ToList();

这会返回一个包含 3 个组的列表,每个组一个组。

现在我将如何继续并从这些组中获取仅包含最新版本项目的列表?

【问题讨论】:

  • var test = query.GroupBy(q => q.ItemId).Select(chunk => chunk.OrderByDescending(item => item.VersionId).First()).ToList();

标签: c# sql linq


【解决方案1】:

如果你想要最高版本,你可以订购每组,订购后只拿最高版本:

var test = query.GroupBy(q => q.ItemId)
                .Select(group => group.OrderByDescending(g => g.VersionId).First())
                .ToList();

【讨论】:

  • 此语法给出以下错误:“方法 'First' 只能用作最终查询操作。请考虑在此实例中使用方法 'FirstOrDefault'。” - 将此更改为 FirstOrDefault 或拆分查询修复它。
  • @Patrick,是的,这是 linq 到实体的限制(例如,可以与 linq 到对象一起正常工作)
  • @Patrick 好吧,这取决于数据源。此查询适用于 Linq-To-Objects,如果您的数据源需要特殊约束,请确保满足它们。
  • 如果我错了,请纠正我,但是在GroupBy 之前OrderByDescending 不是更好吗?
  • @vasily.sib 要求按版本订购每个组。分组前排序可能适用于某些数据源,但不能保证行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多