LINQ Select rows mith";“最大值”;版本
我正在使用LINQ,并尝试为每个“CaseId”选择“version”列为max的行 这是一个包含数据的示例表:LINQ Select rows mith";“最大值”;版本,linq,linq-to-sql,max,Linq,Linq To Sql,Max,我正在使用LINQ,并尝试为每个“CaseId”选择“version”列为max的行 这是一个包含数据的示例表: ╔═════════╦══════════╦═════════╦══════════╗ ║ Id ║ CaseId ║ Version ║ ParentId ║ ╠═════════╬══════════╬═════════╬══════════╣ ║ 1 ║ A ║ 0 ║ ║ ║ 2 ║ A
╔═════════╦══════════╦═════════╦══════════╗
║ Id ║ CaseId ║ Version ║ ParentId ║
╠═════════╬══════════╬═════════╬══════════╣
║ 1 ║ A ║ 0 ║ ║
║ 2 ║ A ║ 1 ║ 1 ║
║ 3 ║ A ║ 2 ║ 2 ║
║ 4 ║ B ║ 0 ║ ║
║ 5 ║ B ║ 1 ║ 4 ║
║ 6 ║ C ║ 0 ║ ║
╚═════════╩══════════╩═════════╩══════════╝
预期的结果将是:
╔═════════╦══════════╦═════════╦══════════╗
║ Id ║ CaseId ║ Version ║ ParentId ║
╠═════════╬══════════╬═════════╬══════════╣
║ 3 ║ A ║ 2 ║ 2 ║
║ 5 ║ B ║ 1 ║ 4 ║
║ 6 ║ C ║ 0 ║ ║
╚═════════╩══════════╩═════════╩══════════╝
我使用的LINQ如下所示:
IEnumerable<Case> list =
(from c in db.DBCases
let maxVersion = db.DBCases.Max(c => c.Version)
where (c.Version == maxVersion)
orderby c.CaseId descending
select c);
做下面这样的事情怎么样。它将返回一个字典,其中caseid作为键,max version作为值
list.GroupBy(x => x.CaseId).ToDictionary(x => x.Key, x => x.Max(c => c.Version));
您的
where
子句告诉它要准确地得到您所说的内容(只有版本等于整个表的最大版本的Cases
)。这样想:
// This is 2.
int maxVersionOfWholeTable = db.DBCases.Max(c => c.Version);
// This is essentially what your query is doing:
var query = from c in db.DBCases
where c.Version == maxVersionOfWholeTable
select c;
相反,您可以使用分组来实现所需的结果:
var query = from c in db.DBCases
group c by c.CaseId into g
orderby g.Key descending
select g.OrderByDescending(x => x.Version).FirstOrDefault()
这个版本说:
首先,按CaseId将案例
分为若干组,如下所示:
Group 1 (CaseId = A): 1, 2, 3
Group 2 (CaseId = B): 4, 5
Group 3 (CaseId = C): 6
然后,对于这些组中的每一组,按版本排序,并获得如下最高记录:
Group 1 Ordered: [3], 2, 1
Group 2 Ordered: [5], 4
Group 3 Ordered: [6]
结果是:3,5,6
Edit-回到这个问题,并实现了g.OrderByDescending(x=>x.Version)。FirstOrDefault()
行很好地解释了发生了什么,但在这种情况下使用Max()
会更清楚一些,如下所示:
var query = from c in db.DBCases
group c by c.CaseId into g
orderby g.Key descending
select g.Max(x => x.Version)
没问题。如果您还没有,请查看LinqPad,寻找一个奇妙的沙盒环境,在这里您可以处理查询并快速获得有关发生情况的视觉反馈。@Ocelot20-如果您说有一个类型为Case{Id;CaseId;Version;ParentId}的对象,您将如何将查询表达式与投影结合起来?
var query = from c in db.DBCases
group c by c.CaseId into g
orderby g.Key descending
select g.Max(x => x.Version)