完整源代码购买: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;
}
}
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;
}
}
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/