zoukankan      html  css  js  c++  java
  • 将linq查询转换为DataTable对象——学习笔记

    IQueryable<T>从IEnumerable<T>中派生,包含了LINQ查询表达式信息,通过前向转换为IEnumerable<T>类型的可枚举集合,允许使用foreach语法循环其中的数据。

    LINQToDataTable<T>泛型方法将使用.NET的反射技术从集合中构取DataTable的架构数据,然后循环将集合中的元素添加到DataTable中。

    注意:.NET反射定义在System.Reflection命名空间中,该命名空间允许开发人员从现在类型中获取类型元数据信息 。

    LINQToDataTable<T>泛型方法的实现如代码所示:

        //将IEnumerable<T>类型的集合转换为DataTable类型 
        public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
        {   //定义要返回的DataTable对象
            DataTable dtReturn = new DataTable();
            // 保存列集合的属性信息数组
            PropertyInfo[] oProps = null;
            if (varlist == null) return dtReturn;//安全性检查
            //循环遍历集合,使用反射获取类型的属性信息
            foreach (T rec in varlist)
            {            
                //使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
                if (oProps == null)
                {   
                    oProps = ((Type)rec.GetType()).GetProperties();
                    //循环PropertyInfo数组
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;//得到属性的类型
                        //如果属性为泛型类型
                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {   //获取泛型类型的参数
                            colType = colType.GetGenericArguments()[0];
                        }
                        //将类型的属性名称与属性类型作为DataTable的列数据
                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }
                //新建一个用于添加到DataTable中的DataRow对象
                DataRow dr = dtReturn.NewRow();
                //循环遍历属性集合
                foreach (PropertyInfo pi in oProps)
                {   //为DataRow中的指定列赋值
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? 
                        DBNull.Value : pi.GetValue(rec, null);
                }
                //将具有结果值的DataRow添加到DataTable集合中
                dtReturn.Rows.Add(dr);
            }
            return dtReturn;//返回DataTable对象
        }

    ---

  • 相关阅读:
    《构建之法》前三章读后感--软件工程
    复利计算--web版--总结--软件工程
    利率计算v2.0--web版--软件工程
    <更新日期03-31-2016> 复利计算5.0 <已改进>
    0302随笔
    有限自动机的构造与识别
    评论
    C语言文法
    词法分析 after Coding
    词法分析
  • 原文地址:https://www.cnblogs.com/kingkongv/p/2681022.html
Copyright © 2011-2022 走看看