C# DataTable 转 List<Model>的方法
方法一:
public static IList<T> ConvertTo<T>(DataTable table) { if (table == null) { return null; } List<DataRow> rows = new List<DataRow>(); foreach (DataRow row in table.Rows) { rows.Add(row); } return ConvertTo<T>(rows); } public static IList<T> ConvertTo<T>(IList<DataRow> rows) { IList<T> list = null; if (rows != null) { list = new List<T>(); foreach (DataRow row in rows) { T item = CreateItem<T>(row); list.Add(item); } } return list; } public static T CreateItem<T>(DataRow row) { T obj = default(T); if (row != null) { obj = Activator.CreateInstance<T>(); foreach (DataColumn column in row.Table.Columns) { PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName); try { object value = row[column.ColumnName]; prop.SetValue(obj, value, null); } catch { //You can log something here //throw; } } } return obj; }
方法二:
把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。 所以很多人都是按照以下方式做的: // 获得查询结果 DataTable dt = DbHelper.ExecuteDataTable(...); // 把DataTable转换为IList<UserInfo> IList<UserInfo> users = ConvertToUserInfo(dt); 问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗? 解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Reflection; namespace NCL.Data { /// <summary> /// 实体转换辅助类 /// </summary> public class ModelConvertHelper<T> where T : new() { public static IList<T> ConvertToModel(DataTable dt) { // 定义集合 IList<T> ts = new List<T>();
// 获得此模型的类型 Type type = typeof(T); string tempName = ""; foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } } } 使用方式: // 获得查询结果 DataTable dt = DbHelper.ExecuteDataTable(...); // 把DataTable转换为IList<UserInfo> IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);方法三:
public IEnumerable<T_Admin> ListAll()
{
List<T_Admin> list = new List<T_Admin>();
DataTable dt = SqlHelper.ExecuteDataTable("select * from T_Admin");
foreach (DataRow row in dt.Rows)
{
list.Add(ToModel(row));
}
return list;
}
private static T_Admin ToModel(DataRow row)
{
T_Admin model = new T_Admin();
model.Id = row.IsNull("Id") ? null : (System.Int32?)row["Id"];
model.UserName = row.IsNull("UserName") ? null : (System.String)row["UserName"];
model.PassWord = row.IsNull("PassWord") ? null : (System.String)row["PassWord"];
model.NickName = row.IsNull("NickName") ? null : (System.String)row["NickName"];
model.Vip = row.IsNull("Vip") ? null : (System.Int32?)row["Vip"];
model.AddTime = row.IsNull("AddTime") ? null : (System.DateTime?)row["AddTime"];
model.LastTime = row.IsNull("LastTime") ? null : (System.DateTime?)row["LastTime"];
model.IsOk = row.IsNull("IsOk") ? null : (System.Boolean?)row["IsOk"];
return model;
}
{
List<T_Admin> list = new List<T_Admin>();
DataTable dt = SqlHelper.ExecuteDataTable("select * from T_Admin");
foreach (DataRow row in dt.Rows)
{
list.Add(ToModel(row));
}
return list;
}
private static T_Admin ToModel(DataRow row)
{
T_Admin model = new T_Admin();
model.Id = row.IsNull("Id") ? null : (System.Int32?)row["Id"];
model.UserName = row.IsNull("UserName") ? null : (System.String)row["UserName"];
model.PassWord = row.IsNull("PassWord") ? null : (System.String)row["PassWord"];
model.NickName = row.IsNull("NickName") ? null : (System.String)row["NickName"];
model.Vip = row.IsNull("Vip") ? null : (System.Int32?)row["Vip"];
model.AddTime = row.IsNull("AddTime") ? null : (System.DateTime?)row["AddTime"];
model.LastTime = row.IsNull("LastTime") ? null : (System.DateTime?)row["LastTime"];
model.IsOk = row.IsNull("IsOk") ? null : (System.Boolean?)row["IsOk"];
return model;
}