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);
        }
Beispiel #2
0
        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);
        }