zoukankan      html  css  js  c++  java
  • List<T>转换为DataTable

       今天小姚碰到个问题,有个以前的程序直接调用数据库用dataset和datatable.但是现在想加一层Model层.获取List<T>后赋值给Table时碰到难题.

        本来我觉得这就是个简单的问题,将Table看做一张表,直接循环List后赋值即可.查了下资料才知道自己把DataTable想得太简单了....

         先说后来用到的方法一:

    List<info> infos = Dal.GetInfos();
    DataTable dt = new DataTable();
    dt.Columns.Add("cName");
    
    foreach(var info in infos)
    {
         DataRow dr = dt.NewRow();
         dr["cName"] = info.Name;
         dt.Add(dr);
    }

         再说网上通用的方法二:

     public static class DataTableExtensions
        {
            /// <summary>
            /// 转化一个DataTable
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <returns></returns>
            public static DataTable ToDataTable<T>(this IEnumerable<T> list)
            {
                //创建属性的集合
                List<PropertyInfo> pList = new List<PropertyInfo>();
                //获得反射的入口
                Type type = typeof(T);
                DataTable dt = new DataTable();
                //把所有的public属性加入到集合 并添加DataTable的列
                Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
                foreach (var item in list)
                {
                    //创建一个DataRow实例
                    DataRow row = dt.NewRow();
                    //给row 赋值
                    pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
                    //加入到DataTable
                    dt.Rows.Add(row);
                }
                return dt;
            }
    
            /// <summary>
            /// DataTable 转换为List 集合
            /// </summary>
            /// <typeparam name="TResult">类型</typeparam>
            /// <param name="dt">DataTable</param>
            /// <returns></returns>
            public static List<T> ToList<T>(this DataTable dt) where T : class, new()
            {
                //创建一个属性的列表
                List<PropertyInfo> prlist = new List<PropertyInfo>();
                //获取TResult的类型实例  反射的入口
                Type t = typeof(T);
                //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表 
                Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
                //创建返回的集合
                List<T> oblist = new List<T>();
    
                foreach (DataRow row in dt.Rows)
                {
                    //创建TResult的实例
                    T ob = new T();
                    //找到对应的数据  并赋值
                    prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                    //放入到返回的集合中.
                    oblist.Add(ob);
                }
                return oblist;
            }
    
    
            /// <summary>
            /// 将集合类转换成DataTable
            /// </summary>
            /// <param name="list">集合</param>
            /// <returns></returns>
            public static DataTable ToDataTableTow(IList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            object obj = pi.GetValue(list[i], null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
            /**/
            /// <summary>
            /// 将泛型集合类转换成DataTable
            /// </summary>
            /// <typeparam name="T">集合项类型</typeparam>
            /// <param name="list">集合</param>
            /// <returns>数据集(表)</returns>
            public static DataTable ToDataTable<T>(IList<T> list)
            {
                return ToDataTable<T>(list, null);
            }
    
            /**/
            /// <summary>
            /// 将泛型集合类转换成DataTable
            /// </summary>
            /// <typeparam name="T">集合项类型</typeparam>
            /// <param name="list">集合</param>
            /// <param name="propertyName">需要返回的列的列名</param>
            /// <returns>数据集(表)</returns>
            public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
            {
                List<string> propertyNameList = new List<string>();
                if (propertyName != null)
                    propertyNameList.AddRange(propertyName);
    
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        if (propertyNameList.Count == 0)
                        {
                            result.Columns.Add(pi.Name, pi.PropertyType);
                        }
                        else
                        {
                            if (propertyNameList.Contains(pi.Name))
                                result.Columns.Add(pi.Name, pi.PropertyType);
                        }
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            if (propertyNameList.Count == 0)
                            {
                                object obj = pi.GetValue(list[i], null);
                                tempList.Add(obj);
                            }
                            else
                            {
                                if (propertyNameList.Contains(pi.Name))
                                {
                                    object obj = pi.GetValue(list[i], null);
                                    tempList.Add(obj);
                                }
                            }
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
        }
    
  • 相关阅读:
    CentOS7 64位下MySQL5.7安装与配置
    Linux CentOS7.0下JAVA安装和配置环境变量
    在MySQL中使用explain查询SQL的执行计划
    ionic3中使用自定义配置
    RabbitMQ发布订阅实战-实现延时重试队列
    springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
    Python之Mysql及SQLAlchemy操作总结
    数据库分库分表思路
    RPC框架实践之:Apache Thrift
    vue使用watch 观察路由变化,重新获取内容
  • 原文地址:https://www.cnblogs.com/kulong995/p/1740328.html
Copyright © 2011-2022 走看看