泛型加反射,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;
}
//最终结果 策略:分次查询,后台过滤,若过滤字段不存在则不过滤
//先查询出数据,转换为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;
}
相关文章推荐
- DataSet和List<T> 泛型之间互相转换
- List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
- DataSet、DataTable转换List(泛型集合与DataSet互相转换 )
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- DataSet和List 泛型之间互相转换 (转载, 作者写的很好)
- DataSet转换为泛型集合List(Of T)
- DataSet和List 泛型之间互相转换 (转载, 作者写的很好)
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- DataSet和List<T> 泛型之间互相转换
- DataTable转换list泛型集合(反射)
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- DataSet和List<T> 泛型之间互相转换
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
- DataSet和List 泛型之间互相转换 (转载)
- C#中string[]数组和list<string>泛型的相互转换 【转】
- List泛型相互的转换的一些现象
- 【Gson】Json转换利器一-简单对象转化和带泛型的List转化