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

如何查询匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:07:30