所以我有如下数据(请注意,这些表是简化的(:
Header:
Id
1
2
3
Child:
Id HeaderId Code Round
1 1 A 1
2 1 A 2
3 1 B 1
4 2 A 1
5 2 B 1
6 2 C 1
7 3 A 2
8 3 B 1
9 3 A 1
我想计算在他们的最大回合中有多少个标题中他们的孩子中没有 B,从上面的数据表中结果应该是 2,因为:
标题 1在第 2 轮中没有 B(标题 1 最大回合为 2(
标题 2 在第 1 轮中有 B
标题 3在第 2 轮中没有 B(标题 3 最大回合为 2(
这是我尝试过的 LINQ
var result = data.Where(e =>
!e.Child.Any(a =>
a.Code == "B" &&
a.Round == e.Child.Max(c => c.Round))).Count();
但是不起作用,我得到了这个
ORA-00904:"范围 1"。EXPENSE_ID":标识符无效
"范围1"。ID"是标题表上的 Id 列
在这种情况下,我如何获得最大回合?
-----解决了,谢谢-----
您所需要的只是Child
表。您可以按HeaderId
对子项进行分组,然后找到每个HeaderId
的最大Round
,并检查该轮中子项的Code
。
var ans = Child.GroupBy(c => c.HeaderId)
.Where(cg => {
var maxRound = cg.Max(c => c.Round);
return cg.Where(c => c.Round == maxRound).All(c => c.Code != "B");
})
.Count();
事实证明,我的 linq 不起作用var result
因为它是一个IQueryable
所以我需要先使用.ToList()
将其更改为 List,然后再将其改回 Queryable 使用.AsQueryable()
(如果需要(,这是最后的 linq:
var result = data.ToList().Where(e =>
!e.Child.Any(a =>
a.Code == "B" &&
a.Round == e.Child.Max(c => c.Round))).Count();
感谢所有帮助过我的人