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

完整源代码购买:http://livexy.taobao.com/

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/

 

你可能感兴趣的:(Datatable)