使用LINQ Lambda在子表中获取最大值

时间:2018-07-02 10:17:55

标签: c# entity-framework 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在第二轮中没有B(标题1最大回合为2)

  2. 标题2在第一回合中有B

  3. 标题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列

在这种情况下如何获得最大回合?

-----解决了,谢谢-----

2 个答案:

答案 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 resultIQueryable,因此我需要先使用.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();

感谢所有帮助过我的人