无法将运算符'=='应用于'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
相关产品推荐
相关产品推荐

