如何比较可空int类型Id与List<int>集合,判断Id是否在集合中
LINQ 可空int与int列表的包含判断实现
你现有代码的核心问题是第二段LINQ直接将单个可空int?类型的Id与整个List<int>做相等比较,类型逻辑完全不匹配,自然无法得到预期结果。你需要调用列表的Contains方法判断值是否存在于集合中。
实现方案
方案1:保留分步写法的修正版
你已经提前筛选了Id不为空的结果,直接取Id的Value属性判断即可:
var selectId = array.Where(x => x.Id != null); // 修正后的第二行过滤逻辑 var result = selectId.Where(x => settings.PersonIds.Contains(x.Id.Value));
方案2:合并为单步查询(更简洁)
可以把非空判断和包含判断合并,无需拆分两次Where调用:
var result = array.Where(x => x.Id.HasValue && settings.PersonIds.Contains(x.Id.Value));
注意事项
- 内存中执行LINQ to Objects时,必须保证调用
x.Id.Value前已经判断Id不为空,否则会抛出InvalidOperationException异常。 - 如果是EF Core等ORM场景下执行数据库查询,无需担心
Value调用的异常问题,ORM会自动将可空类型的判断转换为对应SQL逻辑。
内容的提问来源于stack exchange,提问作者Derin Kadir
相关产品推荐
相关产品推荐

