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)
你的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)
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |