【发布时间】:2017-05-13 16:47:54
【问题描述】:
有没有办法将查询自动映射到 C# 中的类中以便强类型化查询结果?我不想使用 DataTable 访问查询结果,不再手动指定列名。
【问题讨论】:
-
使用实体框架可能......或其他 ORM
有没有办法将查询自动映射到 C# 中的类中以便强类型化查询结果?我不想使用 DataTable 访问查询结果,不再手动指定列名。
【问题讨论】:
有几个选项:
EntityFramework - 强大而重量级。 https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx
Dapper - 轻量级 - 主要是映射器 https://www.codeproject.com/Articles/212274/A-Look-at-Dapper-NET
如果您只需要存储过程、查询等的映射,Dapper 是不错的选择,因为它基本上是向connection 对象添加扩展方法。它无法将数据库等创建为实体框架,但这一切都取决于需求。
【讨论】:
我最喜欢的问题。使用QueryFirst。在 SQL 编辑器窗口中编写您的 SQL,在您键入时验证语法,然后 QueryFirst 将生成 C# 包装器来执行它,并带有强类型输入和输出。还有许多其他好处 :-) 内置 SqlServer、MySql 和 Postgres 支持。其他易于添加。免责声明:我编写了 QueryFirst。
【讨论】:
你应该看看AutoMapper。这是一种将DataTable 映射到您的规范的List<object> 的简单且用户友好的方式。
你可以找到一篇讨论它的文章(包括示例代码)here。
如果您想自动化该过程,您可以使用 dynamic 对象,它不需要您为正在使用的每个 DataTable 创建特定的类。
希望这会有所帮助!
【讨论】:
List<dynamic> objects = AutoMapper.Mapper.DynamicMap<IDataReader, List<object>>(dataTable.CreateDataReader()); DataTable 必须是强类型的,但映射的对象不需要。所以,是的,它将在运行时完成。
objects[0].testVariable = 5; 将在运行时评估,因为它是匿名类型。
LINQ to DB 上有一个有用的库
“LINQ to DB 是最快的 LINQ 数据库访问库,在 POCO 对象和数据库之间提供了一个简单、轻便、快速且类型安全的层。”
【讨论】: