/// <summary> /// Parsing the collection structure /// </summary> /// <param name="modelType">Collection type</param> private void ParseCollectionStructure(Type modelType) { _queryInfo.ModelStructureTable = new List <MappingInfo>(); MappingInfo structure = new MappingInfo(); structure.MapFieldType = MappingInfo.FieldType.CollectionItem; structure.FullType = modelType.GetGenericArguments().First(); structure.MapFieldName = String.Empty; ParseInnerType(structure); _queryInfo.ModelStructureTable.Add(structure); }
/// <summary> /// Tries to read non nullable field /// </summary> /// <param name="reader">DB data reader</param> /// <param name="structure">Field mapping info</param> /// <param name="modelType">Mapping model type</param> /// <param name="boxedModel">Boxed model object</param> private static void ReadNonNullableField(IDataReader reader, MappingInfo structure, Type modelType, object boxedModel) { object value = reader[structure.DbFieldName]; MemberInfo memberInfo = GetAppropriateMember(modelType.GetMember(structure.MapFieldName), structure); if (memberInfo == null) { return; } try { value = Convert.ChangeType(value, structure.InnerType); } catch (FormatException ex) { try { value = Convert.ChangeType(value, structure.InnerType, CultureInfo.InvariantCulture); } catch (FormatException) { throw new AdoHelperMappingException(reader.GetName(reader.GetOrdinal(structure.DbFieldName)), reader[structure.DbFieldName].GetType(), structure.MapFieldName, structure.InnerType); } } catch (Exception ex) { throw ex; } switch (structure.MapFieldType) { case MappingInfo.FieldType.Field: (memberInfo as FieldInfo).SetValue(boxedModel, value); break; case MappingInfo.FieldType.Property: (memberInfo as PropertyInfo).SetValue(boxedModel, value, null); break; } }
/// <summary> /// Parsing the inner structure of object /// </summary> /// <param name="modelType">Object type</param> private void ParseModelStructure(Type modelType) { _queryInfo.ModelStructureTable = new List <MappingInfo>(); // Parse properties foreach (MemberInfo memberInfo in modelType.GetMembers()) { MappingInfo structure = new MappingInfo(); if (memberInfo.MemberType == MemberTypes.Field) { structure.MapFieldType = MappingInfo.FieldType.Field; structure.FullType = (memberInfo as FieldInfo).FieldType; } else if (memberInfo.MemberType == MemberTypes.Property && ((memberInfo as PropertyInfo).CanWrite || _queryInfo.ModelType == QueryInfo <T> .ModelEntityType.Tuple)) { structure.MapFieldType = MappingInfo.FieldType.Property; structure.FullType = (memberInfo as PropertyInfo).PropertyType; } else { continue; } structure.MapFieldName = memberInfo.Name; if (!CheckMappingRights(memberInfo)) { continue; } // Set field attribute SetPropertyMapName(memberInfo, structure); // Parse type ParseInnerType(structure); // Add to structure _queryInfo.ModelStructureTable.Add(structure); } }
/// <summary> /// Asynchronously executes a DbDataReader and reads data into collection of collections /// </summary> /// <typeparam name="T">Collection type</typeparam> /// <param name="queryInfo">Query info</param> /// <param name="cancellationToken">Cancellation token</param> /// <returns>Collection of collections</returns> private static async Task <List <T> > ExecuteCollectionReaderAsync <T>(QueryInfo <T> queryInfo, CancellationToken?cancellationToken) { Type modelType = typeof(T); List <T> enumerable = new List <T>(); try { using (IDataReader reader = await GetReaderAsync(queryInfo, cancellationToken)) { MappingInfo structure = queryInfo.ModelStructureTable[0]; while (reader.Read()) { List <object> parameters = new List <object>(); object collection = ObjectCreator.CreateEnumerable(modelType); MethodInfo addMethod = collection.GetType().GetMethod("Add"); if (addMethod == null) { throw new NotSupportedException("Collection should implement 'void Add(object value)' method"); } for (int i = 0; i < reader.FieldCount; i++) { object value = (reader[i].Equals(System.DBNull.Value)) ? null : reader[i]; value = Convert.ChangeType(value, structure.InnerType); addMethod.Invoke(collection, new object[] { value }); } enumerable.Add((T)collection); } } } catch (Exception ex) { throw ex; } return(enumerable); }
/// <summary> /// Tries to read nullable field /// </summary> /// <param name="reader">DB data reader</param> /// <param name="structure">Field mapping info</param> /// <param name="modelType">Mapping model type</param> /// <param name="boxedModel">Boxed model object</param> private static void ReadNullableField(IDataReader reader, MappingInfo structure, Type modelType, object boxedModel) { object value = (reader[structure.DbFieldName].Equals(System.DBNull.Value)) ? null : reader[structure.DbFieldName]; MemberInfo memberInfo = GetAppropriateMember(modelType.GetMember(structure.MapFieldName), structure); if (memberInfo == null) { return; } try { value = Convert.ChangeType(value, structure.InnerType); } catch (FormatException ex) { try { value = Convert.ChangeType(value, structure.InnerType, CultureInfo.InvariantCulture); } catch (FormatException) { throw new AdoHelperMappingException(reader.GetName(reader.GetOrdinal(structure.DbFieldName)), reader[structure.DbFieldName].GetType(), structure.MapFieldName, structure.InnerType); } } catch (Exception ex) { throw ex; } Type memberType; switch (structure.MapFieldType) { case MappingInfo.FieldType.Field: memberType = (memberInfo as FieldInfo).FieldType; break; case MappingInfo.FieldType.Property: memberType = (memberInfo as PropertyInfo).PropertyType; break; default: return; } if (memberType.IsGenericType && memberType.GetGenericTypeDefinition() == typeof(Nullable <>)) { var targetType = Nullable.GetUnderlyingType(memberType); value = Convert.ChangeType(value, targetType); } switch (structure.MapFieldType) { case MappingInfo.FieldType.Field: (memberInfo as FieldInfo).SetValue(boxedModel, value); break; case MappingInfo.FieldType.Property: (memberInfo as PropertyInfo).SetValue(boxedModel, value, null); break; } }