You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个Lambda表达式查询?请验证我的实现是否正确

合并Lambda表达式查询的正确方式

首先得先拆解你原来代码的逻辑,顺便纠正个小笔误:原代码里定义了allNumbersEmpty(判断所有RollNumber为空),但后面用的是!allSerialNumbersEmpty,应该是变量名写错了,我统一改成allRollNumbersEmpty来理清逻辑。

原代码的核心逻辑

你原来的代码要判断的是两个条件同时成立:

  • 至少存在一个员工DTO满足ExceptionIfAny == null(也就是dtosToCheck.Any()为真)
  • 不是所有员工的RollNumber都为空(也就是!allRollNumbersEmpty,等价于「至少有一个员工的RollNumber不为空」)

你的尝试为什么不对

你写的Where(dto => dto.ExceptionIfAny == null || dto.Identity.RollNumber == ""),是筛选出「ExceptionIfAny为空 或者 RollNumber为空」的DTO,然后判断是否存在这样的元素。这和原逻辑完全不是一回事:

  • 比如如果所有员工的RollNumber都为空,但没有ExceptionIfAny为空的DTO,你的尝试会返回false,这时候和原逻辑结果一致;
  • 但如果有部分员工RollNumber为空,同时有ExceptionIfAny为空的DTO,但所有员工的RollNumber其实都是空的,你的尝试会认为条件成立,但原逻辑里!allRollNumbersEmpty是false,所以原if条件不会触发——这就出现了逻辑偏差。

正确的合并方式

根据你是否需要保留dtosToCheck集合,有两种写法:

1. 不需要保留筛选后的集合,只判断条件

直接把两个独立的判断合并在一起,代码更简洁清晰:

bool shouldExecuteLogic = empDtos.Any(dto => dto.ExceptionIfAny == null) 
                          && empDtos.Any(dto => dto.Identity.RollNumber != "");

if (shouldExecuteLogic)
{
    // 这里写你的业务逻辑
}

2. 需要保留dtosToCheck集合(后续要用到)

那可以保留筛选集合的逻辑,同时单独判断RollNumber的条件:

var dtosToCheck = empDtos.Where(dto => dto.ExceptionIfAny == null).ToList();
bool hasNonEmptyRollNumber = empDtos.Any(dto => dto.Identity.RollNumber != "");

if (dtosToCheck.Any() && hasNonEmptyRollNumber)
{
    // 这里写你的业务逻辑
}

其实这两个条件本身是独立的,分开写反而可读性更高,不需要强行合并成一个Where查询——毕竟原逻辑的核心是两个独立的存在性判断,不是筛选出某个交集/并集的集合。

内容的提问来源于stack exchange,提问作者Suraj Rai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:42