我正在考虑创建一个可以存储数据库中行记录的对象列表。但是,数据库的列可能是未知的,这意味着我不知道我的对象属性及其类型。关于我如何实现这一点的任何想法。请找到以下代码
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的文档,我意识到你仍然需要定义要在列中将列从数据库映射到其对象的类属性。我实际上正在寻找一种工具,为您创建类属性,就像在实体框架中一样。但是比实体框架更简单的工具
答案 0 :(得分:0)
您最好的选择可能是使用像dapper这样的工具,它已经完全符合这一点:
Observable.combineLatest(L,R) { lhs, rhs in
return (lhs, rhs)
}
.distinctUntilChanged { last, new in
return last.1 != new.1
}
.map { combined in
//Do your thing to create the combination
}
请注意,如果您已经拥有命令代码,它还具有在数据读取器之上构建的机制:
var queryResult = connection.Query<TTSlogobj >(sql, args).AsList();
如果你想没有一个库,那么:反射。通常使用泛型,所以你使用var rowReader = SqlMapper.GetRowParser<TTSlogobj>(newReader);
while(newReader.Read())
{
queryResult.Add(rowReader(newReader));
}
等。问题是反射相对慢,所以你进入高级元编程领域,使性能与它相同如果您手动编写代码,并缓存区域,那么您可以自动重复使用已经花费时间创建的策略。这些是dapper为您做的两件主要事情,为什么使用库是有用的。 Dapper 还包含大量代码,可帮助您执行查询 - 使参数化更容易等。