使用 LINQ lambda 获取子表中的最大值



所以我有如下数据(请注意,这些表是简化的(:

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
  1. 在第 2 轮中没有 B(标题 1 最大回合为 2(

  2. 标题 2 在第 1 轮中有 B

  3. 标题 3
  4. 在第 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();

感谢所有帮助过我的人

最新更新