C# LINQ查询使用条件语句:合并两类查询的可行性问询
当然可以合并成一个查询!
完全没必要分开判断成员数量再执行不同的查询,我们可以利用LINQ的条件表达式直接在一个查询里完成逻辑判断,一次性返回对应的名称。
合并后的查询代码:
var result = await db.ExpertCommittees .Where(f => f.Id == committeeId) .Select(f => f.ExpertCommitteeMembers.Count > 1 ? f.ExpertCommitteeMembers.FirstOrDefault(m => m.IsCommitteeHead)?.Expert.FullName : f.ExpertCommitteeMembers.FirstOrDefault()?.Expert.FullName) .FirstOrDefaultAsync();
逻辑解释:
- 我们在
Select里使用了三元运算符(?:)来做条件判断:- 当委员会成员数大于1时,就筛选出
IsCommitteeHead为true的成员,取其全名; - 当成员数等于1时,直接取唯一的那个成员的全名;
- 当委员会成员数大于1时,就筛选出
- 这里用了
?.空传播操作符,避免因为找不到对应成员(比如成员数大于1但没有设置负责人)导致的NullReferenceException,如果出现这种情况会返回null; - 整个查询只需要访问数据库一次,比分开两次查询更高效。
额外优化建议(覆盖边界场景):
如果担心成员数为0的情况(你的原查询没处理这个场景),可以用C# 8.0+的switch表达式让逻辑更清晰:
var result = await db.ExpertCommittees .Where(f => f.Id == committeeId) .Select(f => f.ExpertCommitteeMembers.Count switch { 0 => null, 1 => f.ExpertCommitteeMembers.First().Expert.FullName, _ => f.ExpertCommitteeMembers.FirstOrDefault(m => m.IsCommitteeHead)?.Expert.FullName }) .FirstOrDefaultAsync();
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

