Linq查询返回匿名类型无法转换为SCADA_DATA_Truncated类列表报错
问题根因
你遇到的类型转换报错由两个问题共同导致:
select new { ... }语法生成的是匿名类型实例,和你自定义的SCADA_DATA_Truncated类没有任何兼容转换关系,无法直接互转- 你尝试将整个
List<匿名类型>强制转换为单个SCADA_DATA_Truncated对象的写法本身存在语法错误
修复方案
只需要在select子句中直接实例化你自定义的SCADA_DATA_Truncated类即可,EF可以正常解析这种属性初始化的写法,DbFunctions.TruncateTime的返回值也刚好匹配你类中COLDATE字段的Nullable<DateTime>类型:
List<SCADA_DATA_Truncated> dataResults = (from b in a2Entity.SCADA_DATA where DbFunctions.TruncateTime(b.COLDATE) >= dateCheck1 && DbFunctions.TruncateTime(b.COLDATE) <= dateCheck2 && whereInAcode.Contains(b.acode) && whereInLoc.Contains(b.LOCCODE) select new SCADA_DATA_Truncated // 这里改为实例化你的自定义类 { COLDATE = DbFunctions.TruncateTime(b.COLDATE), acode = b.acode, LOCCODE = b.LOCCODE, RESULT = b.RESULT, analyte = b.analyte } ).ToList();
可选优化建议
你可以对查询条件做小优化,避免重复调用DbFunctions.TruncateTime:
List<SCADA_DATA_Truncated> dataResults = (from b in a2Entity.SCADA_DATA let truncDate = DbFunctions.TruncateTime(b.COLDATE) where truncDate >= dateCheck1 && truncDate <= dateCheck2 && whereInAcode.Contains(b.acode) && whereInLoc.Contains(b.LOCCODE) select new SCADA_DATA_Truncated { COLDATE = truncDate, acode = b.acode, LOCCODE = b.LOCCODE, RESULT = b.RESULT, analyte = b.analyte } ).ToList();
内容的提问来源于stack exchange,提问作者Julius Alexander
相关产品推荐
相关产品推荐

