【问题标题】:create a list of object with unknown properties创建具有未知属性的对象列表
【发布时间】:2018-04-16 10:11:50
【问题描述】:

我正在考虑创建一个对象列表,用于存储数据库中的行记录。但是,数据库的列可能是未知的,这意味着我不知道我的对象属性及其类型。关于我如何实现这一目标的任何想法。请找到以下代码

public class TTSlogobj
{
    public string Name { get; set; }
    public int Id { get; set; }
    public int Age { get; set; }
    public string address { get; set; }

}

 using (SqlDataReader newReader = command.ExecuteReader())
            {
                while (newReader.Read())    
                {

                    queryResult.Add(new TTSlogobj() {
                        Name = newReader["name"].ToString(),
                        Id   = Convert.ToInt16(newReader["Id"]),
                        Age  = Convert.ToInt16(newReader["Age"]),
                        address = newReader["address"].ToString(),

                    });
                }


            }

从代码中可以看出,TTSlogobj 具有属性,即数据库中的列名,我如何在不知道数据库中的列及其类型的情况下编写 TTSlogobj。我浏览了 dapper 的文档,我意识到您仍然必须定义类属性,您希望在其中将列从数据库映射到其对象。我实际上正在寻找一种工具来为您创建类属性,就像在实体框架中一样。但比实体框架更简单的工具

【问题讨论】:

  • 你为什么要这样做?
  • 如果您不知道您希望从数据库中读取什么,您希望如何使用它?我敢肯定会有一些方法可以让你阅读/反映这些信息,但我不确定你会如何实际使用它,除非你使用这些信息来填充一些具体的类。
  • @d219 我完全不同意 - 这是这样想要做的常见事情,我们编写了一个库来做只是这个,它有超过 200 万次下载。
  • 公平。图书馆的名字是什么?如果我发现需要使用完全“抽象”的类,我会看看。

标签: c# sql list


【解决方案1】:

您最好的选择可能是使用像 dapper 这样已经可以做到这一点的工具:

var queryResult = connection.Query<TTSlogobj >(sql, args).AsList();

请注意,如果您已经拥有命令代码,它还具有构建在数据读取器之上的机制:

var rowReader = SqlMapper.GetRowParser<TTSlogobj>(newReader);
while(newReader.Read())
{
    queryResult.Add(rowReader(newReader));
}

如果你想在没有库的情况下这样做,那么:反射。通常使用泛型,所以你会使用typeof(T).GetProperties() 等。问题是反射相对很慢,所以你进入高级元编程领域以使性能与它本来的相同如果您手动编写代码并缓存区域,这样您就可以自动重用您已经花时间创建的策略。这是 dapper 为您做的两件主要事情,这就是为什么使用库很有用。 Dapper 包含许多代码来帮助您执行查询 - 使参数化更容易等等。

【讨论】:

  • 谢谢你的回复,我也在考虑反射,但我对它的性能做了一些研究,结果被拒绝了。我会看看你的工具,希望它很有用。
  • @TobiOwolawi 它确实非常有用 - 它加载了(几乎)此页面上的所有数据,例如 :) 一些使用说明在这里:github.com/StackExchange/Dapper
  • 我浏览了 dapper 的文档,我意识到您仍然需要定义对象属性,以便在其中映射数据库中的列。我实际上正在寻找一种工具来为您创建类属性,就像在实体框架中一样。但比实体框架更简单的工具
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2014-10-17
  • 2020-02-05
相关资源
最近更新 更多