泛型加反射,DataSet转换为List

  #region 泛型方法,完成数据转换和过滤
        //最终结果   策略:分次查询,后台过滤,若过滤字段不存在则不过滤

        //先查询出数据,转换为list,再使用linq对数据进行过滤

     // storedProcedure 存储过程名

    // Parameters 存储过程参数

    //fileterFun linq表达式,可为null

        public IEnumerable<T> GetPayReportList<T>(string storedProcedure,List<SqlParameter> Parameters,  Func<List<T>, IEnumerable<T>> fileterFun )where T:new()
        {
            IEnumerable<T> mrlist = new List<T>();
            DataSet ds = db1.ExecuteDataSet(storedProcedure, CommandType.StoredProcedure, Parameters.ToArray());//获取数据集
            if (ds.Tables.Count < 1)
            {
                return null;
            }
            else
            {
                PropertyInfo[] PInfos = typeof(T).GetProperties();
                List<T> mrs = new List<T>();
                foreach (DataRow dr in ds.Tables[0].Rows)//转换数据表转换为list
                {
                    T mr = DataRowToEntity<T>(dr,PInfos);
                    mrs.Add(mr);
                }
                if (fileterFun==null)//如果过滤函数为null,直接赋值
                {
                    mrlist = mrs;
                }
                else
                {
                    mrlist = fileterFun(mrs);
                }
                return mrlist;
            }
        }
        //数据行转换为实体类
        public T DataRowToEntity<T>(DataRow dr,PropertyInfo[] PInfos) where T:new()
        {
            T t = new T();
            //PropertyInfo[] PInfos  = t.GetType().GetProperties();//属性
            int i = 0;
            foreach (PropertyInfo p in PInfos)
            {//注意:类的属性和DataRow列要按顺序一一对应
                    switch (p.PropertyType.ToString())
                    {
                        case "System.Int64": p.SetValue(t, Convert.ToInt64(dr[i] ?? 0), null); break;
                        case "System.Int32": p.SetValue(t, Convert.ToInt32(dr[i] ?? 0), null); break;
                        case "System.Double": p.SetValue(t, Convert.ToDouble(dr[i] ?? 0), null); break;
                        case "System.Decimal": p.SetValue(t, Convert.ToDecimal(dr[i] ?? 0), null); break;
                        case "System.DateTime": p.SetValue(t, Convert.ToDateTime(dr[i] ?? new DateTime()), null); break;
                        default: p.SetValue(t, dr[i].ToString(), null); break;
                    }
                i++;
            }
            return t;

        }

  //获取数据集
        public DataSet GetDataSet(SqlDbHelper db, string storedProcedure, SqlParameter[] Parameters)
        {
            DataSet ds = db.ExecuteDataSet(storedProcedure, CommandType.StoredProcedure, Parameters);//获取数据集
            return ds;

        }

 //重载
        public IEnumerable<T> GetPayReportList<T>(DataTable dt, Func<List<T>, IEnumerable<T>> fileterFun) where T : new()
        {
                IEnumerable<T> mrlist = new List<T>();
                PropertyInfo[] PInfos = typeof(T).GetProperties();
                List<T> mrs = new List<T>();
                foreach (DataRow dr in dt.Rows)//转换数据表转换为list
                {
                    T mr = DataRowToEntity<T>(dr, PInfos);
                    mrs.Add(mr);
                }
                if (fileterFun == null)//如果过滤函数为null,直接赋值
                {
                    mrlist = mrs;
                }
                else
                {
                    mrlist = fileterFun(mrs);
                }
                return mrlist;
           
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值