LINQ to Entities中调用.Contains()方法查询报错咨询
错误原因
Contains方法的调用主体写反,直接导致方法签名不匹配报错:
- 代码中
x.id是单个整数类型值,不存在接收整数列表作为参数的Contains重载,x.id.Contains(byProcs)的写法是尝试在单个int值上执行集合包含判断,编译器找不到匹配的方法实现,因此抛出参数数量/类型不匹配的错误。 - LINQ to Entities中通过ID列表筛选数据的逻辑,本质是生成SQL的
IN查询,正确的调用逻辑是在ID集合上调用Contains方法,传入单条记录的待匹配字段作为参数,判断当前记录的ID是否存在于目标ID列表中。
修正代码
var byProcs = db.ProcedureLabs .Where(x => x.LabID == labID) .Select(x => x.ProcID) .ToList(); // 调整Contains调用主体为ID集合byProcs,传入当前记录的id作为匹配参数 var actProcs = db.Procedures.Where(x => byProcs.Contains(x.id));
性能优化写法
如果不需要对byProcs列表做额外的内存逻辑处理,可以省略ToList()调用,直接写嵌套查询,EF会自动生成带IN子查询的SQL语句,减少一次数据库往返和内存占用:
var actProcs = db.Procedures .Where(x => db.ProcedureLabs .Where(p => p.LabID == labID) .Select(p => p.ProcID) .Contains(x.id));
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

