我正在尝试检索具有多个列的表,并且我创建了一个类,该类能够将每一行表示为具有属性的对象。
E.G。
class TableA {
int prop1;
int prop2;
....
}
我正在使用SqlDataReader读取每行的值,然后将其分配给我创建的对象
TableA tab = new TableA()
tab.prop1 = sqlreader.GetValue(prop1_ordinal).toString();
目前我需要明确说明:
tab.prop1 = etc2..
tab.prop2 = etc2...
当我有很多属性(20+左右)时,这可能会非常麻烦。
我应该使用哪些其他替代品?
我正在考虑使用词典或类似的东西,但我不知道如何开始。这样,我可以使用foreach循环遍历所有属性的列表并设置值。
基本上,我不想仅仅为了设置值而添加太多的冗余代码。
在将所有数据放入对象后,我将基本上在操作和更改值后将其写入CSV文件。
任何想法都会受到赞赏吗?
答案 0 :(得分:2)
您是否尝试过使用linq生成表格&架构:
[Table(Name = "Test")]
public class TableA
{
[Column(IsPrimaryKey = true)]
public int ID { get; set; }
[Column]
public int prop1 { get; set; }
[Column]
public int prop2 { get; set; }
}
static int main()
{
var constr = @" Data Source=NOTEBOOK\SQLEXPRESS;Initial Catalog=DemoDataContext;Integrated Security=True " ;
var context = new DataContext(constr) { Log = Console.Out };
var metaTable = context.Mapping.GetTable( typeof (TableA));
var typeName = " System.Data.Linq.SqlClient.SqlBuilder " ;
var type = typeof (DataContext).Assembly.GetType(typeName);
var bf = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod;
var sql = type.InvokeMember( " GetCreateTableCommand " , bf, null , null , new [] { metaTable });
Console.WriteLine(sql);
// Excute SQL Command
}
确保包含System.Data.Linq和:
using System.Data.Linq.Mapping;
using System.Data.Linq;
using System.Reflection;
您可以在以下位置找到更多信息: https://msdn.microsoft.com/en-us/library/bb384396.aspx
一旦映射完所有内容,您就可以使用linq函数为对象填充对象,将数据导入到对象中!
答案 1 :(得分:0)
EntityFramework是为这样的事物设计的ORM(对象关系映射器)。它非常适合企业级产品,但如果你有一个较小的项目,它会非常庞大和笨重。 Dapper是一种超轻量级的ORM,基本上可以做到
tab.prop1 = sqlreader.GetValue(prop1_ordinal).toString();
如果您将属性命名为与列名称相同,则为您提供部分。你用NuGet把Dapper拉进来。以下代码将为您提供对象的IEnumerable(TModel)。
IEnumerable<TModel> result;
using (MySqlConnection conn = new MySqlConnection(_mysqlConnString))
{
// "Query" is a Dapper extension method that stuffs the datareader into objects based on the column names
result = conn.Query<TModel>("Select * from YourTable");
}
// do stuff with result
这链接到一个完整的示例,而不仅仅是我从当前项目中提取的部分。 http://www.tritac.com/bp-24-dapper-net-by-example
答案 2 :(得分:0)
您所描述的问题是我们使用对象关系映射器(ORM)的主要原因之一。最容易用于Microsoft SQL Server的可能是Linq2Sql,但实体框架允许您使用其他数据库引擎,并允许您定义更复杂的关系。另一个固体ORM是NHibernate。
答案 3 :(得分:0)
如果您发现EntityFramework变得庞大而笨重,您可以尝试Trinity Framework它是一个小型数据库,第一个带有T4模板的ORM框架和智能映射到您的数据库。
金块:PM&gt;安装包TrinityFramework