文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>IDataReader/DataTable扩展ToList<T> 改进版,反射速度慢的惊人!

IDataReader/DataTable扩展ToList<T> 改进版,反射速度慢的惊人!

时间:2010-09-01  来源:熊哥

IDataReader扩展ToList<T> 改进版


        //最快和直接循环差不多
        public static List<TResult> ToList<TResult>(this IDataReader dr, bool isClose) where TResult : class, new() {
            IDataReaderEntityBuilder<TResult> eblist = IDataReaderEntityBuilder<TResult>.CreateBuilder(dr);
            List<TResult> list = new List<TResult>();
            if (dr == null) return list;
            while (dr.Read()) list.Add(eblist.Build(dr));
            if (isClose) { dr.Close(); dr.Dispose(); dr = null; }
            return list;
        }
        public static List<TResult> ToList<TResult>(this IDataReader dr) where TResult : class, new() {
            return dr.ToList<TResult>(true);
        }

        //也慢
        public static List<TResult> ToList2<TResult>(this IDataReader dr, bool isClose) where TResult : class, new() {
            List<TResult> oblist = new List<TResult>();
            if (dr == null) return oblist;

            List<string> drColumns = new List<string>();
            int len = dr.FieldCount;
            for (int j = 0; j < len; j++) drColumns.Add(dr.GetName(j).Trim());
            
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            Type t = typeof(TResult);
            Array.ForEach<PropertyInfo>(t.GetPropertiesCache(), p => { if (drColumns.IndexOf(p.Name) != -1) prlist.Add(p); });

            while (dr.Read()) {
                TResult ob = new TResult();
                prlist.ForEach(p => { if (dr[p.Name] != DBNull.Value) p.SetValue(ob, dr[p.Name], null); });
                oblist.Add(ob);
            }
            if (isClose) { dr.Close(); dr.Dispose(); dr = null; }
            return oblist;
        }
        public static List<TResult> ToList2<TResult>(this IDataReader dr) where TResult : class, new() {
            return dr.ToList2<TResult>(true);
        }

        //最慢
        public static List<TResult> ToList3<TResult>(this IDataReader dr, bool isClose) where TResult : class, new() {
            List<TResult> list = new List<TResult>();
            if (dr == null) return list;
            int len = dr.FieldCount;

            while (dr.Read()) {
                TResult info = new TResult();
                for (int j = 0; j < len; j++) {
                    if (dr[j] == null || string.IsNullOrEmpty(dr[j].ToString())) continue;
                    info.GetType().GetPropertyCache(dr.GetName(j).Trim()).SetValue(info, dr[j], null);
                }
                list.Add(info);
            }
            if (isClose) { dr.Close(); dr.Dispose(); dr = null; }
            return list;
        }
        public static List<TResult> ToList3<TResult>(this IDataReader dr) where TResult : class, new() {
            return dr.ToList3<TResult>(true);
        }

 

谢谢"幸运草"提供更快速的DataReader转实体LIST的代码.我将发在这里:

    public class IDataReaderEntityBuilder<Entity> {
        private static readonly MethodInfo getValueMethod =
        typeof(IDataRecord).GetMethod("get_Item", new Type[] { typeof(int) });
        private static readonly MethodInfo isDBNullMethod =
            typeof(IDataRecord).GetMethod("IsDBNull", new Type[] { typeof(int) });
        private delegate Entity Load(IDataRecord dataRecord);

        private Load handler;
        private IDataReaderEntityBuilder() { }
        public Entity Build(IDataRecord dataRecord) {
            return handler(dataRecord);
        }
        public static IDataReaderEntityBuilder<Entity> CreateBuilder(IDataRecord dataRecord) {
            IDataReaderEntityBuilder<Entity> dynamicBuilder = new IDataReaderEntityBuilder<Entity>();
            DynamicMethod method = new DynamicMethod("DynamicCreateEntity", typeof(Entity),
                    new Type[] { typeof(IDataRecord) }, typeof(Entity), true);
            ILGenerator generator = method.GetILGenerator();
            LocalBuilder result = generator.DeclareLocal(typeof(Entity));
            generator.Emit(OpCodes.Newobj, typeof(Entity).GetConstructor(Type.EmptyTypes));
            generator.Emit(OpCodes.Stloc, result);
            for (int i = 0; i < dataRecord.FieldCount; i++) {
                PropertyInfo propertyInfo = typeof(Entity).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;
        }
    }

 

使用反射的同志们,请放泣使用反射方法转实体类LIST.

 

DataTable扩展ToList<T> 改进版


        //最快和直接循环差不多
        public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class, new() {
            List<TResult> list = new List<TResult>();
            if (dt == null) return list;
            DataTableEntityBuilder<TResult> eblist = DataTableEntityBuilder<TResult>.CreateBuilder(dt.Rows[0]);
            foreach(DataRow info in dt.Rows) list.Add(eblist.Build(info));
            dt.Dispose(); dt = null;
            return list;
        }

        //也慢
        public static List<TResult> ToList2<TResult>(this DataTable dt) where TResult : class, new() { 
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            Type t = typeof(TResult);
            Array.ForEach<PropertyInfo>(t.GetPropertiesCache(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
            List<TResult> oblist = new List<TResult>();

            foreach (DataRow row in dt.Rows) {
                TResult ob = new TResult();
                prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                oblist.Add(ob);
            }
            return oblist;
        }

        //最慢
        public static List<TResult> ToList3<TResult>(this DataTable dt) where TResult : class, new() {
            List<TResult> list = new List<TResult>();
            if (dt == null) return list;
            int len = dt.Rows.Count;

            for (int i = 0; i < len; i++) {
                TResult info = new TResult();
                foreach (DataColumn dc in dt.Rows[0].Table.Columns) {
                    if (dt.Rows[i][dc.ColumnName] == null || string.IsNullOrEmpty(dt.Rows[i][dc.ColumnName].ToString())) continue;
                    info.GetType().GetPropertyCache(dc.ColumnName).SetValue(info, dt.Rows[i][dc.ColumnName], null);
                }
                list.Add(info);
            }
            dt.Dispose(); dt = null;
            return list;
        }
    public class DataTableEntityBuilder<Entity> {
        private static readonly MethodInfo getValueMethod = typeof(DataRow).GetMethod("get_Item", new Type[] { typeof(int) });
        private static readonly MethodInfo isDBNullMethod = typeof(DataRow).GetMethod("IsNull", new Type[] { typeof(int) });
        private delegate Entity Load(DataRow dataRecord);

        private Load handler;
        private DataTableEntityBuilder() { }

        public Entity Build(DataRow dataRecord) {
            return handler(dataRecord);
        }
        public static DataTableEntityBuilder<Entity> CreateBuilder(DataRow dataRecord) {
            DataTableEntityBuilder<Entity> dynamicBuilder = new DataTableEntityBuilder<Entity>();
            DynamicMethod method = new DynamicMethod("DynamicCreateEntity", typeof(Entity), new Type[] { typeof(DataRow) }, typeof(Entity), true);
            ILGenerator generator = method.GetILGenerator();
            LocalBuilder result = generator.DeclareLocal(typeof(Entity));
            generator.Emit(OpCodes.Newobj, typeof(Entity).GetConstructor(Type.EmptyTypes));
            generator.Emit(OpCodes.Stloc, result);

            for (int i = 0; i < dataRecord.ItemArray.Length; i++) {
                PropertyInfo propertyInfo = typeof(Entity).GetProperty(dataRecord.Table.Columns[i].ColumnName);
                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, propertyInfo.PropertyType);
                    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;
        }
    }

 

 

 公司招人借主页用一天

1、大专以上学历,三年以上C#.NET/JS/CSS开发经验;
2、两年以上大型软件系统架构设计经验,二年以上项目管理经验优先;
3、精通SQL Server数据库,有海量数据处理经验优先;
4、有独立开发网站经验,能熟练使用jquery/ajax/json优先;
5、有作品,精通js/css,能熟练写DIV+CSS HTML代码,会使用dw/ps拆分图片优先;
6、良好的沟通、表达及分析能力,有团队合作精神,有学习新知识的渴望和优秀的学习能力。

欢迎加入我们,请投简历:

 http://job.cnblogs.com/offer/8966/

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载