博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# DataTable 和List之间相互转换的方法
阅读量:5073 次
发布时间:2019-06-12

本文共 5123 字,大约阅读时间需要 17 分钟。

 

介绍:List/IEnumerable转换到DataTable/DataView,以及DataTable转换到List

 

一、List<T>/IEnumerable转换到DataTable/DataView

 

方法一:

/// /// Convert a List{T} to a DataTable./// private DataTable ToDataTable
(List
items){    var tb = new DataTable(typeof (T).Name);     PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance);     foreach (PropertyInfo prop in props)    {        Type t = GetCoreType(prop.PropertyType);        tb.Columns.Add(prop.Name, t);    }     foreach (T item in items)    {        var values = new object[props.Length];         for (int i = 0; i < props.Length; i++)        {            values[i] = props[i].GetValue(item, null);        }         tb.Rows.Add(values);    }     return tb;} ///
/// Determine of specified type is nullable/// public static bool IsNullable(Type t){    return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));} ///
/// Return underlying type if type is Nullable otherwise return the type/// public static Type GetCoreType(Type t){    if (t != null && IsNullable(t))    {        if (!t.IsValueType)        {            return t;        }        else        {            return Nullable.GetUnderlyingType(t);        }    }    else    {        return t;    }}

 

方法二:

 

public static DataTable ToDataTable
(IEnumerable
collection) {     var props = typeof(T).GetProperties();     var dt = new DataTable();     dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());     if (collection.Count() > 0)     {         for (int i = 0; i < collection.Count(); i++)         {             ArrayList tempList = new ArrayList();             foreach (PropertyInfo pi in props)             {                 object obj = pi.GetValue(collection.ElementAt(i), null);                 tempList.Add(obj);             }             object[] array = tempList.ToArray();             dt.LoadDataRow(array, true);         }     }     return dt; }

 

 

二、DataTable转换到List

 

方法一:

 

public static IList
ConvertTo
(DataTable table)  {     if (table == null)     {         return null;     }      List
rows = new List
();      foreach (DataRow row in table.Rows)     {         rows.Add(row);     }      return ConvertTo
(rows);  }   public static IList
ConvertTo
(IList
rows)  {     IList
list = null;      if (rows != null)     {         list = new List
();          foreach (DataRow row in rows)         {             T item = CreateItem
(row);             list.Add(item);         }     }      return list;}     public static T CreateItem
(DataRow row)    {    T obj = default(T);        if (row != null)        {           obj = Activator.CreateInstance
();            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
  IList
users = ConvertToUserInfo(dt);

问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?  

解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了  

 

using System;      using System.Collections.Generic;  using System.Text;    using System.Data;    using System.Reflection;  namespace NCL.Data    {        ///         /// 实体转换辅助类        ///         public class ModelConvertHelper
where   T : new()         {            public static IList
ConvertToModel(DataTable dt)             {                // 定义集合                 IList
ts = new List
();                  // 获得此模型的类型                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
  IList
users = ModelConvertHelper
.ConvertToModel(dt);

 

转载:http://www.okbase.net/doc/details/3282

转载于:https://www.cnblogs.com/tianciliangen/p/7209528.html

你可能感兴趣的文章
要研究的内容
查看>>
json文件
查看>>
行变列 拼接字符串 MSSQL 一个超级搞的问题
查看>>
mongoDB之C#and.net Driver
查看>>
nginx 日志怎么实现显示真实客户端IP
查看>>
linux下shapely的安装
查看>>
Linux MySQL5.6.36安装手册
查看>>
fdffafadf
查看>>
对偶锥
查看>>
随机数代码实现
查看>>
MVC之排球比赛计分程序 ——(六)使用框架,创建控制器,生成数据库
查看>>
最长回文(hdu 3068)
查看>>
牛客网——G大水题
查看>>
integer encoding vs 1-hot (py)
查看>>
python输出带颜色字体详解--转载
查看>>
解决微信小程序开发中wxss中不能用本地图片
查看>>
JS输入框邮箱自动提示(带有demo和源码)
查看>>
端口扫描技术
查看>>
连接数据库
查看>>
ios开发swift学习第三天:逻辑分支
查看>>