O/ r -映射单个任意SQL SELECT语句到单个类

本文关键字:SELECT SQL 语句 单个类 单个任 映射 | 更新日期: 2023-09-27 17:54:02

我不太了解ORM工具的工作机制,但从使用实体框架(Entity Framework, EF)来看,我知道从存储在数据库中的任意视图自动生成CLR类是可能的。在EF中,这些类是从实体模型自动生成的。EF甚至可以从存储过程中获取列信息,并根据这些信息生成一个新的"复杂类型"。

  • 怎么可能自动生成。net类,只使用(1)SQL SELECT语句提供的信息和(2)查询数据库元数据的能力?

因为SQL存储在数据库中,我们在编译时就知道SELECT SQL是什么。类似地,实体框架在编译时知道视图或存储过程的SELECT SQL是什么。我们希望通过了解SELECT SQL和查询数据库的元数据来自动生成。net类。我需要能够将生成的单个DataTable转换为自动生成的类。

似乎我的问题的答案在于拥有ORM工具的知识;

  • 是否有ORM工具已经可以做我需要的,或者
  • 你能解释一下实体框架如何从视图和存储过程自动生成它的。net类吗?
  • 或者如果你能想出另一个解决方案来自动生成类我的场景,这也将是感激的。

O/ r -映射单个任意SQL SELECT语句到单个类

表和视图的元数据从系统视图加载:sys.tables, sys.views, sys.columns

编辑:

我刚刚测试了EF如何获取列名和类型,它确实执行存储过程并迭代返回的列。它只使用一些复杂的查询来正确地构建调用命令和处理返回值。

如果使用System.Data.SqlClient名称空间,则实际上不需要ORM来执行此操作。下面是一个用于随机查询语句的简单示例:

public static List<string> GetColumns(string connectionString, string queryString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, connection);
        connection.Open();
        List<string> columnNames = new List<string>();
        SqlDataReader reader = adapter.SelectCommand.ExecuteReader();
        for (int xx = 0; xx < reader.FieldCount; xx++)
        {
            columnNames.Add(reader.GetName(xx));
        }
        return columnNames;
    }
}

这并不能帮助您自动生成类本身。尽管如此,它仍然是提取所需数据的起点。

我知道该怎么做了。我在这里写了一个非常基本的解。