protected List <T> MapRecords <T>(IDataReader reader, int startIndex, int length, ref int totalRecordCount) { var recordList = new List <T>(); int ri = -startIndex; var builder = DynamicBuilder <T> .CreateBuilder(reader); while (reader.Read()) { ri++; if (ri > 0 && ri <= length) { var record = builder.Build(reader); recordList.Add(record); if (ri == length && 0 != totalRecordCount) { break; } } } ClearInputtedData(); totalRecordCount = 0 == totalRecordCount ? ri + startIndex : -1; return(recordList); }
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)); if (IsSingleType(typeof(T))) { generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, 0); generator.Emit(OpCodes.Callvirt, getValueMethod); generator.Emit(OpCodes.Unbox_Any, dataRecord.GetFieldType(0)); generator.Emit(OpCodes.Ret); } else { 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, 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); }
protected List <T> MapRecords <T>(IDataReader reader) { var recordList = new List <T>(); var builder = DynamicBuilder <T> .CreateBuilder(reader); while (reader.Read()) { var record = builder.Build(reader); recordList.Add(record); } ClearInputtedData(); return(recordList); }