LINQ查询方法使用Contains匹配跨查询结果集字段无法生效如何解决
问题解决方法
你需要先从第一个查询的结果中提取所有MORACODE字段值生成独立的值集合,再用该集合做包含匹配即可,修正后可运行的代码如下:
using (var a2Entity = new A2_Data_UATEntities()) { // 提取所有符合条件的MORACODE值集合,无需加载完整MORDetails对象 var morACodeList = (from a in a2Entity.MORDetails where a.MORCODE == this.dropDown1.SelectedItem.Label select a.MORACODE).ToList(); var dataResults = (from b in a2Entity.SCADA_DATA where b.COLDATE >= dateCheck1 && b.COLDATE <= dateCheck2 // 匹配acode是否在目标MORACODE集合范围内 && morACodeList.Contains(b.acode) select b).ToList(); }
优化方案(查询效率更高)
如果数据量较大,你可以直接用关联查询写法,EF会自动生成JOIN语句执行单次数据库查询,避免提前加载第一个集合的性能开销:
using (var a2Entity = new A2_Data_UATEntities()) { var dataResults = (from b in a2Entity.SCADA_DATA join a in a2Entity.MORDetails on b.acode equals a.MORACODE where b.COLDATE >= dateCheck1 && b.COLDATE <= dateCheck2 && a.MORCODE == this.dropDown1.SelectedItem.Label select b).Distinct().ToList(); }
原代码报错原因
morsContent是MORDetails类型的对象列表,直接调用Contains(b.acode)属于类型不匹配,无法完成值校验- 原代码中
&& morsContent[1].MORACODE属于语法错误,缺少判断条件,且固定下标仅能取单个元素的属性,无法匹配列表所有元素的对应字段值。
内容的提问来源于stack exchange,提问作者Julius Alexander
相关产品推荐
相关产品推荐

