您的位置:首页 > 其它

泛型加反射,DataSet转换为List

2018-01-29 14:16 197 查看
  #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;
       
a451
                 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;
           
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: