这几天对表达式进行了学习,有了初步了解.现在 制作 了一个可以读取DataReader的动态表达式,用于替换反射读取数据
----取值
/// <summary>
/// 取值表达式测试
/// </summary>
/// <param name="expr"></param>
public Func<M_Ask, int> 取一个属性值()
{
Expression<Func<M_Ask, int>> expr = p => p.Id;
return expr.Compile();
}
public Func<T, ValT> 取一个属性值表达式版<T, ValT>(T obj, string propertyName)
{
//定义一个参数 p
var p = Expression.Parameter(typeof(T), "p");
//定义一个属性如 p.id
var val = Expression.PropertyOrField(p, propertyName);
//p=>p.id
//LambdaExpression xxx = Expression.Lambda(val, p);
//Delegate res= xxx.Compile();
//p=>p.id
Expression<Func<T, ValT>> func = Expression.Lambda<Func<T, ValT>>(val, p);
return func.Compile();
}
表达式赋值
void dxxdd()
{
Func<bookcc, IDataReader, string> ddd = (e, r) => (e.bookname = r.GetString(0));
}
DataReader赋值(不能读取int?这种数据)
/// <summary>
/// 获取指定索引的数据并且返回调用委托
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <typeparam name="T1">结果类型</typeparam>
/// <param name="index">当前对应在DataReader中的索引</param>
/// <param name="ProPertyName">对应实体类属性名</param>
/// <param name="FieldType">字段类型</param>
/// <returns>返回通过调用的委托</returns>
public Action<T, IDataRecord> SetValueToEntity<T>(int index, string ProPertyName, Type FieldType)
{
Type datareader = typeof(IDataRecord);
var Mdthods = datareader.GetMethods().Where(p => p.ReturnType == FieldType && p.Name.StartsWith("Get") && p.GetParameters().Where(n => n.ParameterType == typeof(int)).Count() == 1);
//获取调用方法
System.Reflection.MethodInfo Method = null;
if (Mdthods.Count() > 0)
{
Method = Mdthods.FirstOrDefault();
}
else
{
throw new EntryPointNotFoundException("没有从DataReader找到合适的取值方法");
}
ParameterExpression e = Expression.Parameter(typeof(T), "e");
ParameterExpression r = Expression.Parameter(datareader, "r");
//常数表达式
ConstantExpression i = Expression.Constant(index);
MemberExpression ep = Expression.PropertyOrField(e, ProPertyName);
MethodCallExpression call = Expression.Call(r, Method, i);
//instance.Property = value 这名话是重点
BinaryExpression assignExpression = Expression.Assign(ep, call);
var ex = Expression.Lambda(assignExpression, e, r);
Expression<Action<T, IDataRecord>> resultEx = Expression.Lambda<Action<T, IDataRecord>>(assignExpression, e, r);
Action<T, IDataRecord> result = resultEx.Compile();
return result;
}
从DataReader填充实体对像集合
public List<T> 从DataReader获取数据值<T>()
where T : new()
{
List<T> result = new List<T>();
IDataReader reader = null;
System.Data.SqlClient.SqlConnection conn = null;
try
{
//查询DataReader
reader = tong.SqlDataReader("select * from book", out conn);
Dictionary<int, DataColumn> columnDics = new Dictionary<int, DataColumn>();
//表达式字典委托
Dictionary<int, Action<T, IDataReader>> actionDics = new Dictionary<int, Action<T, IDataReader>>();
//生成表头
for (int i = 0; i < reader.FieldCount; i++)
{
DataColumn col = new DataColumn()
{
ColumnName = reader.GetName(i),
DataType = reader.GetFieldType(i),
Namespace = reader.GetDataTypeName(i)
};
//添加列
columnDics.Add(i, col);
//获取字典值
actionDics.Add(i, SetValueToEntity<T>(i, col.ColumnName, col.DataType));
}
//查询读取项
while (reader.Read())
{
T objT = new T();
//添加到集合
result.Add(objT);
//填充属性值
foreach (var item in actionDics)
{
//判断字段是否为null
if (!reader.IsDBNull(item.Key))
{
//设置属性值
item.Value(objT, reader);
}
else
{
//null处理
}
}
}
}
finally
{
if (reader != null)
{
reader.Close();
reader.Dispose();
}
if (conn != null)
{
conn.Close();
conn.Dispose();
}
}
return result;
}
实体类定义
#region 实体类
/// <summary>
/// book:实体类(属性说明自动提取数据库字段的描述信息)
/// </summary>
[Serializable]
protected class bookcc
{
#region Model
private decimal _bookid;
private string _mch;
private string _pp;
private string _qch;
private string _jj;
private string _rq;
private string _jg;
private string _zl;
private string _xx;
private string _isbn1;
private string _tp;
private string _nr;
private string _ml;
private string _bookname;
private string _pingpai;
private string _bookchuban;
private string _bookdate;
private string _kaiben;
private int _yeshu;
private int _banci;
private string _zhuang;
private string _isbn;
private string _bookcontent;
private string _bookmulu;
private decimal _pingji;
private decimal _shichangjia;
private decimal _huiyuanjia;
private decimal _vipjia;
private int _bestbook;
private int _tejiabook;
private int _newsbook;
private int _kucun;
private int _chengjiaocount;
private int _liulancount;
private int _dazhe;
private int _nclassid;
private int _anclassid;
private string _bookpic;
private string _bookzz;
private int _pingjizong;
private string _shjianame;
private int _shjiaid;
/// <summary>
///
/// </summary>
public decimal bookid
{
set { _bookid = value; }
get { return _bookid; }
}
/// <summary>
///
/// </summary>
public string mch
{
set { _mch = value; }
get { return _mch; }
}
/// <summary>
///
/// </summary>
public string pp
{
set { _pp = value; }
get { return _pp; }
}
/// <summary>
///
/// </summary>
public string qch
{
set { _qch = value; }
get { return _qch; }
}
/// <summary>
///
/// </summary>
public string jj
{
set { _jj = value; }
get { return _jj; }
}
/// <summary>
///
/// </summary>
public string rq
{
set { _rq = value; }
get { return _rq; }
}
/// <summary>
///
/// </summary>
public string jg
{
set { _jg = value; }
get { return _jg; }
}
/// <summary>
///
/// </summary>
public string zl
{
set { _zl = value; }
get { return _zl; }
}
/// <summary>
///
/// </summary>
public string xx
{
set { _xx = value; }
get { return _xx; }
}
/// <summary>
///
/// </summary>
public string isbn1
{
set { _isbn1 = value; }
get { return _isbn1; }
}
/// <summary>
///
/// </summary>
public string tp
{
set { _tp = value; }
get { return _tp; }
}
/// <summary>
///
/// </summary>
public string nr
{
set { _nr = value; }
get { return _nr; }
}
/// <summary>
///
/// </summary>
public string ml
{
set { _ml = value; }
get { return _ml; }
}
/// <summary>
///
/// </summary>
public string bookname
{
set { _bookname = value; }
get { return _bookname; }
}
/// <summary>
///
/// </summary>
public string pingpai
{
set { _pingpai = value; }
get { return _pingpai; }
}
/// <summary>
///
/// </summary>
public string bookchuban
{
set { _bookchuban = value; }
get { return _bookchuban; }
}
/// <summary>
///
/// </summary>
public string bookdate
{
set { _bookdate = value; }
get { return _bookdate; }
}
/// <summary>
///
/// </summary>
public string kaiben
{
set { _kaiben = value; }
get { return _kaiben; }
}
/// <summary>
///
/// </summary>
public int yeshu
{
set { _yeshu = value; }
get { return _yeshu; }
}
/// <summary>
///
/// </summary>
public int banci
{
set { _banci = value; }
get { return _banci; }
}
/// <summary>
///
/// </summary>
public string zhuang
{
set { _zhuang = value; }
get { return _zhuang; }
}
/// <summary>
///
/// </summary>
public string isbn
{
set { _isbn = value; }
get { return _isbn; }
}
/// <summary>
///
/// </summary>
public string bookcontent
{
set { _bookcontent = value; }
get { return _bookcontent; }
}
/// <summary>
///
/// </summary>
public string bookmulu
{
set { _bookmulu = value; }
get { return _bookmulu; }
}
/// <summary>
///
/// </summary>
public decimal pingji
{
set { _pingji = value; }
get { return _pingji; }
}
/// <summary>
///
/// </summary>
public decimal shichangjia
{
set { _shichangjia = value; }
get { return _shichangjia; }
}
/// <summary>
///
/// </summary>
public decimal huiyuanjia
{
set { _huiyuanjia = value; }
get { return _huiyuanjia; }
}
/// <summary>
///
/// </summary>
public decimal vipjia
{
set { _vipjia = value; }
get { return _vipjia; }
}
/// <summary>
///
/// </summary>
public int bestbook
{
set { _bestbook = value; }
get { return _bestbook; }
}
/// <summary>
///
/// </summary>
public int tejiabook
{
set { _tejiabook = value; }
get { return _tejiabook; }
}
/// <summary>
///
/// </summary>
public int newsbook
{
set { _newsbook = value; }
get { return _newsbook; }
}
/// <summary>
///
/// </summary>
public int kucun
{
set { _kucun = value; }
get { return _kucun; }
}
/// <summary>
///
/// </summary>
public int chengjiaocount
{
set { _chengjiaocount = value; }
get { return _chengjiaocount; }
}
/// <summary>
///
/// </summary>
public int liulancount
{
set { _liulancount = value; }
get { return _liulancount; }
}
/// <summary>
///
/// </summary>
public int dazhe
{
set { _dazhe = value; }
get { return _dazhe; }
}
/// <summary>
///
/// </summary>
public int nclassid
{
set { _nclassid = value; }
get { return _nclassid; }
}
/// <summary>
///
/// </summary>
public int anclassid
{
set { _anclassid = value; }
get { return _anclassid; }
}
/// <summary>
///
/// </summary>
public string bookpic
{
set { _bookpic = value; }
get { return _bookpic; }
}
/// <summary>
///
/// </summary>
public string bookzz
{
set { _bookzz = value; }
get { return _bookzz; }
}
/// <summary>
///
/// </summary>
public DateTime adddate
{
get;
set;
}
/// <summary>
///
/// </summary>
public int pingjizong
{
set { _pingjizong = value; }
get { return _pingjizong; }
}
/// <summary>
///
/// </summary>
public string shjianame
{
set { _shjianame = value; }
get { return _shjianame; }
}
/// <summary>
///
/// </summary>
public int shjiaid
{
set { _shjiaid = value; }
get { return _shjiaid; }
}
#endregion Model
}
#endregion
使用方法
//填充数据
var list = 从DataReader获取数据值<bookcc>();