所以我有以下数据(请注意,这些表已简化):
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在第二轮中没有B(标题1最大回合为2)
标题2在第一回合中有B
标题3在第二轮中没有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列
在这种情况下如何获得最大回合?
-----解决了,谢谢-----
答案 0 :(得分:0)
您需要的只是Child
表。您可以按HeaderId
对子级进行分组,然后为每个Round
找到最大的HeaderId
,然后在那一轮中检查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();
答案 1 :(得分:0)
结果是,我的linq不起作用,因为var result
是IQueryable
,因此我需要先使用.ToList()
将其更改为List,然后再使用.AsQueryable()
将其更改为Queryable。 (如果需要的话),这是最终的linq:
var result = data.ToList().Where(e =>
!e.Child.Any(a =>
a.Code == "B" &&
a.Round == e.Child.Max(c => c.Round))).Count();
感谢所有帮助过我的人