LINQ Select rows mith";“最大值”;版本

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

我正在使用LINQ,并尝试为每个“CaseId”选择“version”列为max的行

这是一个包含数据的示例表:

╔═════════╦══════════╦═════════╦══════════╗
║ 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)