如何查询匹配IQueryable<int>集合的int?类型数据?
需求与问题分析
我有一个IQueryable<int>类型的数据集作为匹配基准,需要筛选出所有UnitID(类型为<int?>)与该集合中任意整数匹配的Source数据。示例中units是整数类型的IQueryable,UnitID为可空整数类型。我尝试了三种写法:
第一种写法(编译报错)
var units = db.Units .Where(x => x.ModelNum.Contains(obj.ModelSerialSearch) || x.SerialNum.Contains(obj.ModelSerialSearch) ) .Select(x => x.id); var source = source.Where(x => x.UnitID.Contains(units));
报错原因:x.UnitID是int?类型,不存在接受IQueryable<int>参数的Contains方法,调用逻辑完全搞反了。
第二种写法(可行但需注意细节)
var source = source.Where(x => units.Contains(x.UnitID));
这种写法是正确的,ORM框架(比如EF Core)会自动将其转换为对应的SQL IN查询。需要注意:如果x.UnitID为null,units.Contains(null)会返回false,null值的记录会被自动排除。
第三种写法(逻辑错误)
var source = source.Where(x => x.UnitID.ToString().Contains(units.ToString()))
这种写法完全不符合需求:units.ToString()会输出集合的类型名称(而非集合中的整数内容),x.UnitID.ToString()是单个数字的字符串,两者的Contains匹配毫无意义。
正确写法推荐
如果需要明确排除UnitID为null的记录,或者ORM对可空类型的Contains支持有问题,可以显式处理:
var unitIds = db.Units .Where(x => x.ModelNum.Contains(obj.ModelSerialSearch) || x.SerialNum.Contains(obj.ModelSerialSearch)) .Select(x => x.id); var filteredSource = source.Where(x => x.UnitID.HasValue && unitIds.Contains(x.UnitID.Value));
如果ORM支持可空类型直接传入Contains(比如EF Core 3.0+),也可以简化为:
var filteredSource = source.Where(x => unitIds.Contains(x.UnitID));
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

