如何合并两个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
相关产品推荐
相关产品推荐

