如何编写包含两种对立场景且带附加条件的LINQ Lambda表达式
问题解答
- 括号隔离条件完全生效,且是必须的
C#中逻辑与&&的优先级高于逻辑或||,你原有写法未对「邮箱相同或UMCN相同」的条件加括号,会导致逻辑完全错误,必须用括号把这部分条件包裹为一个整体。 - 应该使用
.Any()替代.Where()
你的需求是判断是否存在符合条件的行,.Any()会在找到第一个匹配项时立即终止查询,性能远高于先筛选全量匹配项再判断是否为空,且直接返回布尔值,刚好匹配你的业务需求。 - 不需要使用
Expression<Func<T>>做分支判断
你的判断逻辑可以直接整合到单个谓词中,无需额外拆分表达式树,你的判断是正确的。
正确代码示例
bool isExist = scheduleService.GetAll() .Any(x => // 基础通用条件:未删除、服务ID匹配、邮箱/UMCN匹配 !x.Deleted && servicesIdDistinctedBy.Contains(x.ServiceId) && (x.EmailAddress == data.email || x.UMCN == data.UMCN) // 身份条件:满足注册用户要求 或 满足匿名用户要求 && ( // 注册用户条件 x.IsConfirmed // 匿名用户条件 || (x.IsAnonymous.Value && (x.IsConfirmed || DateTime.UtcNow - x.DateTimeUtcRequestSend < Constants.ConfirmationTimeWindow) ) ) ); // isExist为true时返回不允许插入的提示即可
注意事项
如果你的IsAnonymous是可空类型,需要额外加x.IsAnonymous.HasValue的判空逻辑,避免运行时抛出空引用异常。
内容的提问来源于stack exchange,提问作者lonelydev101
相关产品推荐
相关产品推荐

