用Linq和Dataview筛选查询DataTable数据,DataTable和List相互转换

DataTable 的筛选如果直接用select方法返回的是DataRow[]数组,不适合我们再次利用DataTable,

利用DataView可以通过如下方式实现查询结果直接为DataTable:

                DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, new object[] { null, null });
                DataView view = new DataView();
                view.Table = dt;
                view.RowFilter = string.Format("table_name='{0}'", tableName);
                return view.ToTable();

引用System.Data.DataExtenstion命名空间:

var result=from r in dt.AsEnumable() where r.Field<bool>(“checked”)==true select r;

可以对DataTable的列进行隐藏:

ds.Tables[ "stdinfo "].Columns[ "备注 "].ColumnMapping   =   MappingType.Hidden; 
解决..上面这句语句实现了隐藏[ "备注 "]列的功能.

DataTable可以返回对象列表List,通过linq来实现:

            List<ColumnInfo> result = new List<ColumnInfo>();
            DataTable dt=DBHelperOleDb.GetColumnInfo(tableName);
            var a = (from row in dt.AsEnumerable()
                    where 1 == 1
                    select new
                    {
                        ColumnName = row.Field<string>("COLUMN_NAME"),
                        ColumnOrder = row.Field<string>("CORDINAL_pOSITION"),
                        DefaultVal = row.Field<string>("COLUMN_DEFAULT"),
                        Description = row.Field<string>("DESCRIPTION"),
                        IsIdentity = row.Field<string>("Column_FLAGS"),//
                        IsPrimaryKey = row.Field<string>("Column_FLAGS"),//
                        Length = row.Field<string>("CHARACTER_MAXIMUM_LENGTH"),
                        Nullable = row.Field<string>("IS_NULLABLE"),
                        Precision = row.Field<string>("NUMERIC_PRECISION"),
                        Scale = row.Field<string>("NUMERIC_SCALE"),
                        TypeName = row.Field<string>("DATA_TYPE")
                    }).ToList();

引用命名空间:System.Data.DataSetExtension:

var reslult=from r in dt.AsEnumable() where r.Field<bool>("check")==true select r;

DataTable数据转换到集合类:

      

        /// DataTable 转换为List 集合
        /// </summary>
        /// <typeparam name="TResult">类型</typeparam>
        /// <param name="dt">DataTable</param>
        /// <returns></returns>
        //<类型参数必须是类并且具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。<
        public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class,new()
        {


            //创建一个属性的列表
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            //获取TResult的类型实例  反射的入口
            Type t = typeof(TResult);
            //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
            Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
            //创建返回的集合
            List<TResult> oblist = new List<TResult>();
            foreach (DataRow row in dt.Rows)
            {
                //创建TResult的实例
                TResult ob = new TResult();
                //找到对应的数据,并赋值
                prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                //放入到返回的集合中.
                oblist.Add(ob);
            }
            return oblist;
        }

List也可以转换成DataTable:

    /// 将泛类型集合List类转换成DataTable 
        /// </summary> 
        /// <param name="list">泛类型集合</param> 
        /// <returns></returns> 
        public static DataTable ToDataTable<T>(List<T> entitys)
        {

            //检查实体集合不能为空 
            if (entitys == null || entitys.Count < 1)
            {
                throw new Exception("需转换的集合为空");
            }

            //取出第一个实体的所有Propertie 
            Type entityType = entitys[0].GetType();
            PropertyInfo[] entityProperties = entityType.GetProperties();

            //生成DataTable的structure 
            //生产代码中,应将生成的DataTable结构Cache起来,此处略 
            DataTable dt = new DataTable();
            for (int i = 0; i < entityProperties.Length; i++)
            {
                //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
                dt.Columns.Add(entityProperties[i].Name);
            }

            //将所有entity添加到DataTable中 
            foreach (object entity in entitys)
            {
                //检查所有的的实体都为同一类型 
                if (entity.GetType() != entityType)
                {
                    throw new Exception("要转换的集合元素类型不一致");
                }
                object[] entityValues = new object[entityProperties.Length];
                for (int i = 0; i < entityProperties.Length; i++)
                {
                    entityValues[i] = entityProperties[i].GetValue(entity, null);

                }
                dt.Rows.Add(entityValues);
            }
            return dt;
        } 

datatable和list的转化:

现在的DataTable慢慢退出历史舞台,主要是有以下几个原因:


1.List<t>是强类型化的,而DataTable不是一般的DataTable,
访问某列时,是通过string的ColumnName来取得的,
比如:string name = dt.Rows[i][&quot;Name&quot;].ToString();
因为是string的列名,存在记错写错的风险,且编译不检查而List<t>,
因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。
不容易出错:string name = list[0].Name;


2.Linq的强有力支持,使得操作List<t>有前所未有的快感其实在linq出来之前,
还是DataTable用的多,因为要想过滤数据,可以用DataView,DataTable.Select()等方法。
而List<t>只能是自己写循环,麻烦。Linq出来之后,where,join,group by,order by...等等操作,
对于List<t>的查询真是很便利。


3.DataTable的结构远比List<t>要复杂,内存占用量更大。在有变化的场合下,
DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据List<t>就没有这些累赘,更轻快。所以,Linq+List<t>才使得现在大家越来越倾向使用List<t>而不是DataTable

                                                                              -------------以上评价来自网络



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值