【问题标题】:Map SQL Query results into entities (C#)将 SQL 查询结果映射到实体 (C#)
【发布时间】:2017-05-13 16:47:54
【问题描述】:

有没有办法将查询自动映射到 C# 中的类中以便强类型化查询结果?我不想使用 DataTable 访问查询结果,不再手动指定列名。

【问题讨论】:

  • 使用实体框架可能......或其他 ORM

标签: c# mysql orm automap


【解决方案1】:

有几个选项:

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 对象添加扩展方法。它无法将数据库等创建为实体框架,但这一切都取决于需求。

【讨论】:

  • 如何使用 Dapper 从查询结果中自动创建类?
  • 没有什么能为你做的。因为这无论如何都不是好的做法。您可以基于现有数据库(但不在运行时)通过 EntityFramework 生成类。这些天来,您应该创建类并使用 EF 从它们中创建数据库,而不是其他方式。
  • “不在运行时”这一事实很好。通过这种方式,我可以强类型我的 DataTable。如果它在运行时创建类我不能这样做。我是对的?
  • 在ORM中没有更多的DataTable,它是类到数据库对象的关系。 DataTable 已经是您跳过 ORM 的时刻了。
  • 为什么`DataTable's对你如此重要?
【解决方案2】:

我最喜欢的问题。使用QueryFirst。在 SQL 编辑器窗口中编写您的 SQL,在您键入时验证语法,然后 QueryFirst 将生成 C# 包装器来执行它,并带有强类型输入和输出。还有许多其他好处 :-) 内置 SqlServer、MySql 和 Postgres 支持。其他易于添加。免责声明:我编写了 QueryFirst。

【讨论】:

  • 该工具似乎非常适合我的需求,但为什么即使表中充满了查询结果,生成的所有类都是空的?
  • 空班是什么意思?你安装了这个工具?您已经创建了设计时和运行时数据源?您已经编写了一个运行的查询,因此您可以检查生成的包装器和 poco?您调用 Execute() 并获得空实例?有多少?
  • 我正在使用 Microsoft SQL Server
  • 好的,然后确保你的 QfDefaultConnection 有一个 provider="System.Data.SqlClient"。
  • 这是我的 QfRuntimeConnection 类 QfRuntimeConnection { public static string GetConnectionString() { return ConfigurationSettings.AppSettings["QfRuntimeConnection"]; } }
【解决方案3】:

你应该看看AutoMapper。这是一种将DataTable 映射到您的规范的List<object> 的简单且用户友好的方式。

你可以找到一篇讨论它的文章(包括示例代码)here

如果您想自动化该过程,您可以使用 dynamic 对象,它不需要您为正在使用的每个 DataTable 创建特定的类。

希望这会有所帮助!

【讨论】:

  • 嗨,谢谢你的回答。我想自动化这个过程,在你发布的文章中,他告诉创建一个与 DataTable 的列匹配的类,但我想自动完成(而不是手动创建类)。
  • 很好,但这一切都是在运行时完成的,对吗?所以我不能强类型 DataTable。
  • 你可以这样做:List<dynamic> objects = AutoMapper.Mapper.DynamicMap<IDataReader, List<object>>(dataTable.CreateDataReader()); DataTable 必须是强类型的,但映射的对象不需要。所以,是的,它将在运行时完成。
  • 也许我的英语不好没有帮助。如果我按照您说的做,如果这将在运行时进行评估,我如何才能在特定的列名处访问自动完成功能?
  • 自动完成不适用于动态对象。您需要确保在手动编程时没有犯任何错误。例如objects[0].testVariable = 5; 将在运行时评估,因为它是匿名类型。
【解决方案4】:

LINQ to DB 上有一个有用的库

“LINQ to DB 是最快的 LINQ 数据库访问库,在 POCO 对象和数据库之间提供了一个简单、轻便、快速且类型安全的层。”

https://github.com/linq2db/linq2db

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2015-05-18
  • 2013-01-14
  • 2023-03-18
相关资源
最近更新 更多