コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }