DataTable转List<T>
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;
}
posted on 2013-02-25 14:25 the Jade Emperor 阅读(409) 评论(0) 收藏 举报
浙公网安备 33010602011771号