C# datatable to list
C# DataTable 和List之间相互转换的方法
发布者:好饱 

发布日期:2013-1-27 22:17:49   更新日期:2013-1-27 22:18:55
阅读次数:9554
评分:4.80
介绍:List/IEnumerable转换到DataTable/DataView,以及DataTable转换到List
正文:
一、List<T>/IEnumerable转换到DataTable/DataView
方法一:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /// <summary>/// Convert a List{T} to a DataTable./// </summary>privateDataTable ToDataTable<T>(List<T> items){    var tb = newDataTable(typeof(T).Name);    PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);    foreach(PropertyInfo prop inprops)    {        Type t = GetCoreType(prop.PropertyType);        tb.Columns.Add(prop.Name, t);    }    foreach(T item initems)    {        var values = newobject[props.Length];        for(inti = 0; i < props.Length; i++)        {            values[i] = props[i].GetValue(item, null);        }        tb.Rows.Add(values);    }    returntb;}/// <summary>/// Determine of specified type is nullable/// </summary>publicstaticboolIsNullable(Type t){    return!t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));}/// <summary>/// Return underlying type if type is Nullable otherwise return the type/// </summary>publicstaticType GetCoreType(Type t){    if(t != null&& IsNullable(t))    {        if(!t.IsValueType)        {            returnt;        }        else        {            returnNullable.GetUnderlyingType(t);        }    }    else    {        returnt;    }} | 
方法二:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | publicstaticDataTable ToDataTable<T>(IEnumerable<T> collection) {     var props = typeof(T).GetProperties();     var dt = newDataTable();     dt.Columns.AddRange(props.Select(p => newDataColumn(p.Name, p.PropertyType)).ToArray());     if(collection.Count() > 0)     {         for(inti = 0; i < collection.Count(); i++)         {             ArrayList tempList = newArrayList();             foreach(PropertyInfo pi inprops)             {                 objectobj = pi.GetValue(collection.ElementAt(i), null);                 tempList.Add(obj);             }             object[] array = tempList.ToArray();             dt.LoadDataRow(array, true);         }     }     returndt; } | 
二、DataTable转换到List
方法一:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | publicstaticIList<T> ConvertTo<T>(DataTable table)  {     if(table == null)     {         returnnull;     }     List<DataRow> rows = newList<DataRow>();     foreach(DataRow row intable.Rows)     {         rows.Add(row);     }     returnConvertTo<T>(rows);  }  publicstaticIList<T> ConvertTo<T>(IList<DataRow> rows)  {     IList<T> list = null;     if(rows != null)     {         list = newList<T>();         foreach(DataRow row inrows)         {             T item = CreateItem<T>(row);             list.Add(item);         }     }     returnlist;}    publicstaticT CreateItem<T>(DataRow row)    {    T obj = default(T);        if(row != null)        {           obj = Activator.CreateInstance<T>();           foreach(DataColumn column inrow.Table.Columns)           {               PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);               try           {                   objectvalue = row[column.ColumnName];                   prop.SetValue(obj, value, null);               }               catch           {  //You can log something here                    //throw;               }           }        }    returnobj;    } | 
方法二:
把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。
所以很多人都是按照以下方式做的:
| 1 2 3 4 | // 获得查询结果  DataTable dt = DbHelper.ExecuteDataTable(...);  // 把DataTable转换为IList<UserInfo>  IList<UserInfo> users = ConvertToUserInfo(dt); | 
问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | usingSystem;      usingSystem.Collections.Generic;  usingSystem.Text;    usingSystem.Data;    usingSystem.Reflection;  namespaceNCL.Data    {        /// <summary>        /// 实体转换辅助类        /// </summary>        publicclassModelConvertHelper<T> where   T : new()         {            publicstaticIList<T> ConvertToModel(DataTable dt)             {                // 定义集合                 IList<T> ts = newList<T>();                 // 获得此模型的类型                Type type = typeof(T);                  stringtempName = "";                       foreach(DataRow dr indt.Rows)                   {                     T t = newT();                     // 获得此模型的公共属性                       PropertyInfo[] propertys = t.GetType().GetProperties();                 foreach(PropertyInfo pi inpropertys)                       {                           tempName = pi.Name;  // 检查DataTable是否包含此列                          if(dt.Columns.Contains(tempName))                           {                              // 判断此属性是否有Setter                              if(!pi.CanWrite) continue;                                   objectvalue = dr[tempName];                              if(value != DBNull.Value)                                   pi.SetValue(t, value, null);                       }                      }                       ts.Add(t);                   }                 returnts;              }          }    } | 
使用方式:
| 1 2 3 4 | // 获得查询结果  DataTable dt = DbHelper.ExecuteDataTable(...);  // 把DataTable转换为IList<UserInfo>  IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt); | 
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号