/// <summary> /// 将从数据库中获取的数据行转化为指定的实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr">The dr.</param> /// <returns></returns> protected virtual T FillEntityFromDataReader(SqlDataReader dr) { var builder = DynamicBuilder <T> .CreateBuilder(dr); var instance = builder.Build(dr); return(instance); }
/// <summary> /// 将DataReader的属性值转化为实体类的属性值,返回实体类 /// (提供了默认的反射机制获取信息,为了提高性能,建议重写该函数) /// </summary> /// <param name="dr">有效的DataReader对象</param> /// <returns> /// 实体类对象 /// </returns> protected virtual T DataReaderToEntity(IDataReader dr) { var obj = new T(); var builder = DynamicBuilder <T> .CreateBuilder(dr); while (dr.Read()) { obj = builder.Build(dr); } return(obj); }
/// <summary> /// 通用获取集合对象方法 /// </summary> /// <param name="sql">查询的Sql语句</param> /// <param name="commandType">Type of the command.</param> /// <param name="paramList">参数列表,如果没有则为null</param> /// <param name="connection">The connection.</param> /// <param name="transaction">The transaction.</param> /// <returns></returns> public List <T> GetList(string sql, CommandType commandType, IDbDataParameter[] paramList, DbConnection connection, DbTransaction transaction) { DateTime start = DateTime.Now; var list = new List <T>(); try { var dbc = transaction == null ? new SqlCommand(sql, (SqlConnection)connection) { CommandType = commandType } : new SqlCommand(sql, (SqlConnection)connection, (SqlTransaction)transaction) { CommandType = commandType }; if (paramList != null) { dbc.Parameters.AddRange(paramList); } using (IDataReader dr = dbc.ExecuteReader()) { DynamicBuilder <T> builder = DynamicBuilder <T> .CreateBuilder(dr); while (dr.Read()) { T entity = builder.Build(dr); if (!list.Contains(entity)) { list.Add(entity); } } } dbc.Parameters.Clear(); } catch (Exception ex) { Logger.Error(sql); Logger.Error(ex); } Logger.Debug($"Execute {commandType} : {sql} cost {DateTime.Now.Subtract(start).TotalMilliseconds} ms."); return(list); }
/// <summary> /// Fills the entity from reader. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr">The dr.</param> /// <returns></returns> protected virtual List <T> FillEntitiesFromReader(SqlDataReader dr) { var list = new List <T>(); DynamicBuilder <T> builder = DynamicBuilder <T> .CreateBuilder(dr); using (SqlDataReader reader = dr) { while (reader.Read()) { var instance = builder.Build(reader); if (!list.Contains(instance)) { list.Add(instance); } } } return(list); }
/// <summary> /// Creates the builder. /// </summary> /// <param name="dataRecord">The data record.</param> /// <returns></returns> public static DynamicBuilder <T> CreateBuilder(IDataRecord dataRecord) { DynamicBuilder <T> dynamicBuilder = new DynamicBuilder <T>(); DynamicMethod method = new DynamicMethod("DynamicCreate", typeof(T), new Type[] { typeof(IDataRecord) }, typeof(T), true); ILGenerator generator = method.GetILGenerator(); LocalBuilder result = generator.DeclareLocal(typeof(T)); generator.Emit(OpCodes.Newobj, typeof(T).GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (int i = 0; i < dataRecord.FieldCount; i++) { PropertyInfo propertyInfo = typeof(T).GetProperty(dataRecord.GetName(i)); Label endIfLabel = generator.DefineLabel(); if (propertyInfo != null && propertyInfo.GetSetMethod() != null) { generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, isDBNullMethod); generator.Emit(OpCodes.Brtrue, endIfLabel); generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, getValueMethod); generator.Emit(OpCodes.Unbox_Any, dataRecord.GetFieldType(i)); generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod()); generator.MarkLabel(endIfLabel); } } generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ret); dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load)); return(dynamicBuilder); }