LINQ选择行"mt"版本

Jav*_*ier 2 linq max linq-to-sql

我正在使用LINQ,我试图选择"版本"列为每个"CaseId"最大的行.

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

???????????????????????????????????????????
? 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    ?          ?
???????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

???????????????????????????????????????????
? Id      ? CaseId   ? Version ? ParentId ?
???????????????????????????????????????????
? 3       ? A        ?    2    ?    2     ?
? 5       ? B        ?    1    ?    4     ?
? 6       ? C        ?    0    ?          ?
???????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我正在使用的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);
Run Code Online (Sandbox Code Playgroud)

这当前仅返回具有WHOLE表的最大版本的行,但省略了所有其他记录.

???????????????????????????????????????????
? Id      ? CaseId   ? Version ? ParentId ?
???????????????????????????????????????????
? 3       ? A        ?    2    ?    2     ?
???????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

Oce*_*t20 7

你的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;
Run Code Online (Sandbox Code Playgroud)

相反,您可以使用分组来实现所需的结果:

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()
Run Code Online (Sandbox Code Playgroud)

这个版本说:

首先,Cases由CaseId分组,给你这样的东西:

Group 1 (CaseId = A): 1, 2, 3
Group 2 (CaseId = B): 4, 5
Group 3 (CaseId = C): 6
Run Code Online (Sandbox Code Playgroud)

然后对于每个组,按版本排序并获得如下所示的顶级记录:

Group 1 Ordered: [3], 2, 1
Group 2 Ordered: [5], 4
Group 3 Ordered: [6]
Run Code Online (Sandbox Code Playgroud)

结果:3,5,6.

编辑 - 回到这个问题并意识到这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)
Run Code Online (Sandbox Code Playgroud)