报错:Operator '=='无法应用于'int'与'IQueryable<int>',求代码排查
问题排查与修复方案
嘿,这个错误我太熟悉了!咱们先拆解一下问题根源,再一步步解决:
错误原因
你定义的elimentid是一个IQueryable<int>类型——因为db.Consult.Where(...).Select(x => x.AilmentId)返回的是可查询的整数集合,而非单个int值。但在后续的where条件里,你试图用detail.AilmentId == elimentid把单个int和整个集合做相等比较,C#编译器当然会报错啦,这两种类型根本没法直接用==操作符对比。
分场景修复
根据你的业务逻辑,分两种情况给出解决方案:
场景1:每个EnquiryId对应唯一的AilmentId
如果你的业务规则保证,每个Patientid(也就是EnquiryId)只会返回一个AilmentId,那你需要把elimentid转换成单个int值,用FirstOrDefault()或SingleOrDefault()这类方法:
// 用FirstOrDefault获取单个值,若找不到匹配项则返回默认值0 var elimentid = db.Consult.Where(x => x.EnquiryId == Patientid) .Select(x => x.AilmentId) .FirstOrDefault(); // 此时elimentid是int类型,就能正常用==对比了 var details = (from detail in db.M_SelfHelp join alimet in db.Aliment on detail.SubAilmentId equals alimet.AilmentId where detail.AilmentId == elimentid select new SelpHelp { AlimemtName = alimet.Name, Alimentid = alimet.AilmentId }).ToList();
场景2:每个EnquiryId对应多个AilmentId
如果elimentid可能是多个值的集合,那你需要用Contains()方法来判断detail.AilmentId是否属于这个集合:
// 保留elimentid为IQueryable<int>类型 var elimentid = db.Consult.Where(x => x.EnquiryId == Patientid).Select(x => x.AilmentId); // 用Contains替代==,判断当前AilmentId是否在集合中 var details = (from detail in db.M_SelfHelp join alimet in db.Aliment on detail.SubAilmentId equals alimet.AilmentId where elimentid.Contains(detail.AilmentId) select new SelpHelp { AlimemtName = alimet.Name, Alimentid = alimet.AilmentId }).ToList();
进阶优化方案
其实你可以把两个查询合并成一个,直接通过Join关联Consult表,既避免了类型不匹配的问题,还能减少一次数据库查询,提升效率:
var details = (from detail in db.M_SelfHelp join alimet in db.Aliment on detail.SubAilmentId equals alimet.AilmentId join consult in db.Consult on detail.AilmentId equals consult.AilmentId where consult.EnquiryId == Patientid select new SelpHelp { AlimemtName = alimet.Name, Alimentid = alimet.AilmentId }).ToList();
内容的提问来源于stack exchange,提问作者DevS
相关产品推荐
相关产品推荐

