【问题标题】:Get Max Value in Child Table with LINQ lambda使用 LINQ lambda 在子表中获取最大值
【发布时间】:2018-07-02 10:17:55
【问题描述】:

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

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 在第 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:“Extent1”。“EXPENSE_ID”:无效标识符

"Extent1"."ID" 是 Header 表上的 Id 列

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

-----已解决,谢谢-----

【问题讨论】:

  • 不清楚你在问什么,有什么异常?
  • 所以你想要在最大回合中没有 B 的 Header Id?
  • @TheGeneral 我需要知道有多少 Header 在他们的孩子中没有 B,但是上面的条件仅适用于 header 的孩子的最高一轮。所以如果孩子的标题有B但不是最高轮,它仍然算
  • @SelvaTS 是的,你是对的
  • “但由于 ID 无效(标头表上的 ID)不起作用” - 请澄清这一点。

标签: c# entity-framework linq lambda


【解决方案1】:

您只需要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();

【讨论】:

    【解决方案2】:

    事实证明,我的 linq 不起作用,因为 var resultIQueryable,所以我需要使用 .ToList() 将其更改为 List,然后再使用 .AsQueryable() 将其更改回 Queryable(如果需要),这是最终链接:

    var result = data.ToList().Where(e =>
                 !e.Child.Any(a =>
                        a.Code == "B" &&
                        a.Round == e.Child.Max(c => c.Round))).Count();
    

    感谢所有帮助过我的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多