Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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;
            }
        }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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;
            }
        }