使用C# LinQ无法从数据库选择特定字段的问题排查
解决EF中使用匿名类投影查询时的DbDataRecord引用错误
我完全懂你碰到的这个坑!我之前在维护.NET Framework下的EF项目时也遇到过一模一样的问题——全量查实体没问题,一用select new {}挑字段就报这个DbDataRecord的引用错误。
问题根源
这个报错的核心原因是:当你使用匿名类型做字段投影时,EF底层会用到System.Data程序集里的DbDataRecord类型来处理查询的中间结果;但你的项目没有引用这个程序集,所以编译失败。而全量查询直接返回实体对象时,EF的执行路径不需要依赖这个类型,所以能正常运行。
具体修复步骤
- 添加System.Data程序集引用
- 右键点击你的
805AdminPortal.Reports项目,选择「添加」→「引用」 - 在弹出的「引用管理器」窗口中,切换到「程序集」→「框架」标签
- 找到并勾选
System.Data(版本是4.0.0.0的那个),点击「确定」保存
- 右键点击你的
- 重新编译并验证
重新运行你的投影查询代码:
这时候应该就能正常返回匿名类型的列表了。(from YTD_Tbl in objReport.Batter_YTD_Tbl select new { test = YTD_Tbl.AB}) .ToList();
额外提示
如果你是在.NET Core/.NET 5+的项目里,System.Data已经被整合到基础类库中,不会出现这个问题;但你的项目明显是基于.NET Framework的,所以必须手动添加这个引用。另外,如果你之后还要用到更多EF的投影或复杂查询,这个引用也会帮你避免类似的依赖错误。
内容的提问来源于stack exchange,提问作者user8646340
相关产品推荐
相关产品推荐

