• 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;
        }
  • 相关阅读:
    Python 学习 第八篇:函数2(参数、lamdba和函数属性)
    Python 学习 第七篇:函数1(定义、调用和变量的作用域)
    Python 学习 第六篇:迭代和解析
    Python 学习 第四篇:动态类型模型
    物联网环境下数据分析的应用
    Python 学习 第一篇:数据类型(数字,布尔类型,操作符)
    写于2018年底,有点丧
    云计算助力大数据分析
    python中的__init__方法
    load、loads和 dump、dumps的区别
  • 原文地址:https://www.cnblogs.com/baishiying/p/2932031.html
Copyright © 2020-2023  润新知