【问题标题】:Using conditional statements in linq query c#在 linq 查询 c# 中使用条件语句
【发布时间】:2020-04-27 03:34:48
【问题描述】:

我有 2 个问题。如果委员会有超过 1 个成员,则首先获取委员会负责人的全名。

var result = await db.ExpertCommittees
    .Where(f => f.Id == committeeId)
    .Where(f => f.ExpertCommitteeMembers.Count > 1)
    .Select(f => f.ExpertCommitteeMembers
    .Where(m => m.IsCommitteeHead)
    .FirstOrDefault().Expert.FullName)
    .FirstOrDefaultAsync();

如果委员会只有 1 个成员,则第二个获得唯一委员会成员的全名

var result2 = await db.ExpertCommittees
    .Where(f => f.Id == committeeId)
    .Where(f => f.ExpertCommitteeMembers.Count == 1)
    .Select(f => f.ExpertCommitteeMembers
    .FirstOrDefault().Expert.FullName)
    .FirstOrDefaultAsync();

是否可以检查委员会有多少成员,然后在同一个查询中返回正确的名称?还是我必须先检查委员会有多少成员,然后单独运行适当的查询?

【问题讨论】:

  • 为什么m.IsCommitteeHead不够用?是否有 f.ExpertCommitteeMembers.Count == 1 的行并且没有 Head? ... 编辑: 即使您可以尝试按 IsCommitteeHead 订购 desc 并先拿下
  • 据我了解,查询在调用之前不会运行 (if(result2.something){})。有了这个,你不能得到一个计数,你必须做 .Count()。误会请见谅
  • 有可能成为委员会中唯一的人而不是委员会的负责人
  • 您能提供一些示例数据并期待结果吗?

标签: c# linq if-statement conditional-statements


【解决方案1】:

生成的联接,因为它是从 ExpertCommittees 生成的 具有 Navigation-Collection 的 ExpertCommitteeMembers 将始终执行Left Join, 你想要的是Inner Join。它只会为您提供两个表中都有实体的项目。

这将类似于

    db.ExpertCommittees.Join(db.ExpertCommittemember, x=>someid, y=>somid, 
          (comittee, member) => new { comittee, member});

但这会给每个成员一行.... 可以按“IsComitteeHead”或其他方式过滤。

您可以附加分组,或直接使用 GroupJoin,以获得一个“委员会”列表,每个委员会都有一个其成员列表......并且只有在有成员的情况下。

在不知道数据结构、ID、外键和表名的情况下,我们无法生成有效的查询。

【讨论】:

    【解决方案2】:

    您可以在 linq 查询选择中创建一个创建匿名对象。其中将包含 FullName 和 count。

    var result = await db.ExpertCommittees
        .Where(f => f.Id == committeeId)
        .Where(f => f.ExpertCommitteeMembers.Count > 1)
        .Select(f => new
        {
            FullName = f.ExpertCommitteeMembers
        .Where(m => m.IsCommitteeHead)
        .FirstOrDefault().Expert.FullName,
            Count = f.ExpertCommitteeMembers.Count
        })
        .FirstOrDefaultAsync();
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,您可以尝试让条件进入内部 linqwhere

      var result = await db.ExpertCommittees
          .Where(f => f.Id == committeeId)
          .Select(f => f.ExpertCommitteeMembers.Where(m => 
                       (m.IsCommitteeHead && 
                       f.ExpertCommitteeMembers.Count > 1)||f.ExpertCommitteeMembers.Count == 1).FirstOrDefault().Expert.FullName)
          .FirstOrDefaultAsync();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        相关资源
        最近更新 更多