我有DataTable
和Model
。有没有其他方法可以如何映射类成员的列?让我说明一下我目前的方式,
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列或更多,以及更多类,这是非常耗时的。
我正在寻找的是,还有其他方法可以做到这一点。就像一个现有的课程,但我真的不知道它的名字是什么。
如果已经提出这个问题,请帮我找到链接。
谢谢。
答案 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;
}