将数据表列绑定到类模型中

时间:2013-10-02 13:09:14

标签: c# .net

我有DataTableModel。有没有其他方法可以如何映射类成员的列?让我说明一下我目前的方式,

class Model

private class MyModel
{
    public int ModelID { get; set; }
    public string ModelName { get; set; }
}

DataTable,其中包含以下数据列

ModelID   |   ModelName 

Datatable的记录来自我的SQL查询结果。

SELECT ModelID, ModelName FROM tableName

现在,当我将记录映射到IList<MyModel> myList时,我会进行foreach循环。

foreach (DataRow row in MyDataTable)
{
    MyModel model = new MyModel()
    model.ModelID = Convert.ToInt32(row["Position"].ToString());
    model.ModelName = row["ModelName"].ToString(); 
    myList.Add(model);
}

这完全没问题。这不是一个真正的问题,但考虑到我有很多数据表并且 20列或更多,以及更多类,这是非常耗时的。

我正在寻找的是,还有其他方法可以做到这一点。就像一个现有的课程,但我真的不知道它的名字是什么。

如果已经提出这个问题,请帮我找到链接。

谢谢。

2 个答案:

答案 0 :(得分:2)

AutoMapper应该能够做到这一点,尽管你想要测试它的效率。 This post似乎取得了一些成功:

public class Person
{
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
    public string User_Name { get; set; }
}

List<Person> people = AutoMapper.Mapper.DynamicMap<IDataReader, 
                      List<Person>>(sourceDataTable.CreateDataReader());

请注意,在幕后它可能会做一些与您已经在做的事情非常相似的事情,但是在一些反思中混合以使其更通用。你正在做的事情本身并不是非常低效,除非你说的是真的大量并且需要挤出每一盎司的性能。

使用ORM完全替换DataTable也可能对您有用。 Entity Framework是一个非常常见的标准,尽管还有很多其他标准。 (Dapper以其快速的表现而着称,如果你正在寻找它。)

如果“耗时”部分不是运行时性能而是开发时间,我不会担心它。如果您可以花一些时间将翻译层后面的DataTable抽象为POCO对象,那么从长远来看,这些好处可能会得到回报。这是很多卑鄙的代码,但这是一次性费用。

答案 1 :(得分:0)

你可以使用它。

public static List<T> ToModel<T>(this DataTable dt)
    {
        List<string> columns = (from DataColumn dc in dt.Columns select dc.ColumnName).ToList();

        var fields = typeof(T).GetFields();
        var properties = typeof(T).GetProperties();

        List<T> lst = new List<T>();

        foreach (DataRow dr in dt.Rows)
        {
            var ob = Activator.CreateInstance<T>();

            foreach (var fieldInfo in fields.Where(fieldInfo => columns.Contains(fieldInfo.Name)))
            {
                fieldInfo.SetValue(ob, !dr.IsNull(fieldInfo.Name) ? dr[fieldInfo.Name] : fieldInfo.FieldType.IsValueType ? Activator.CreateInstance(fieldInfo.FieldType) : null);
            }

            foreach (var propertyInfo in properties.Where(propertyInfo => columns.Contains(propertyInfo.Name)))
            {
                propertyInfo.SetValue(ob, !dr.IsNull(propertyInfo.Name) ? dr[propertyInfo.Name] : propertyInfo.PropertyType.IsValueType ? Activator.CreateInstance(propertyInfo.PropertyType) : null);
            }

            lst.Add(ob);
        }

        return lst;
    }