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

无法将运算符'=='应用于'int?'与'IQueryable<int?>,试First()仍无效

问题分析

错误的核心是:where子句中,p.id_loai是单个可空整数(int?),而右侧的子查询(from d in db.Product_details where d.id_product_detail == id_pro select d.id_loai)返回的是一个查询集合(IQueryable<int?>),两者类型不匹配,无法直接用==比较。

解决方案

方案1:先获取目标分类ID,再过滤

先单独查询出指定id_pro对应的分类ID,再用这个单个值去筛选数据,代码更清晰,也避免嵌套子查询的问题:

void load3(long id_pro)
{
    // 先获取目标分类ID,用FirstOrDefault避免无匹配时抛出异常
    var targetLoaiId = db.Product_details
        .Where(d => d.id_product_detail == id_pro)
        .Select(d => d.id_loai)
        .FirstOrDefault();

    // 如果获取到了分类ID,再查询对应的数据
    if (targetLoaiId.HasValue)
    {
        var data3 = from p in db.Product_details
                    join c in db.LoaiSps on p.id_loai equals c.id_Loai
                    where p.id_loai == targetLoaiId.Value
                    select p;

        product3 = data3.ToList();
    }
    else
    {
        // 没有找到对应ID的产品详情时,清空列表或做其他处理
        product3 = new List<Product_detail>();
    }
}

方案2:在子查询中直接获取单个值(修正你之前的尝试)

如果你想保留嵌套子查询的写法,需要确保子查询返回单个值,注意要处理无匹配的情况(用FirstOrDefault而非First,避免无结果时抛出异常):

void load3(long id_pro)
{
    var data3 = from p in db.Product_details
                join c in db.LoaiSps on p.id_loai equals c.id_Loai
                where p.id_loai == (from d in db.Product_details
                                    where d.id_product_detail == id_pro
                                    select d.id_loai)
                                    .FirstOrDefault() // 这里添加FirstOrDefault获取单个值
                select p;

    product3 = data3.Any() ? data3.ToList() : new List<Product_detail>();
}
额外优化建议
  • 原代码中data3 != null判断是多余的,EF的Linq查询返回的IQueryable永远不会为null,直接用Any()判断是否有数据更高效(Count()会遍历所有数据,Any()找到第一条匹配项就停止)。
  • 如果你的查询不需要LoaiSps表的字段,可以去掉join操作,简化查询逻辑。

内容的提问来源于stack exchange,提问作者Huyyyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:12:43