示例#1
0
        internal static void ReadCurrentRow(IDataReader reader, string[] columns, object instance, InterfaceMetadata metaData)
        {
            for (int i = 0; i < columns.Length; ++i)
            {
                object value = reader.GetValue(i);
                if (value is DBNull)
                {
                    continue;
                }

                PropertyMetadata property = metaData.GetProperty(columns[i], true);
                property?.SetValue(instance, ConvertType(value, property.Type));
            }
        }
示例#2
0
        internal static void ReadMultiResultset(IDataReader reader, object instance, InterfaceMetadata metaData, string[] properties)
        {
            for (int index = 0; ; ++index)
            {
                if (properties.Length <= index)
                {
                    throw new ArgumentException("input properties are fewer than number of result set");
                }

                PropertyMetadata property = metaData.GetProperty(properties[index], true);

                // check if result rest is a IEnumerable (only IList is supported)
                if (property.Type.IsGenericType && (property.Type.GetGenericTypeDefinition() == typeof(IList <>)))
                {
                    Type listGenericType = property.Type.GetGenericArguments()[0];

                    var list = Activator.CreateInstance(typeof(List <>).MakeGenericType(listGenericType)) as IList;

                    if (list == null)
                    {
                        throw new ArgumentException($"property '{property.Name}' should be of type IList or IList<>");
                    }

                    string[]          columns = GetColumns(reader);
                    InterfaceMetadata propertyTypeMetadata = GetInterface(listGenericType);

                    ReadSingleResultset(reader, columns, list, propertyTypeMetadata);

                    property.SetValue(instance, list);
                }

                // if property type is interface then get one record from result set
                else if (property.Type.IsInterface && !property.Type.IsGenericType)
                {
                    if (reader.Read())
                    {
                        InterfaceMetadata interfaceType = GetInterface(property.Type);

                        object   value   = Activator.CreateInstance(interfaceType.Concrete);
                        string[] columns = GetColumns(reader);

                        ReadCurrentRow(reader, columns, value, interfaceType);

                        property.SetValue(instance, value);
                    }
                }
                // this case require a plain data type to work correctly
                else
                {
                    if (reader.Read())
                    {
                        property.SetValue(instance, ConvertType(reader[0], property.Type));
                    }
                }

                if (!reader.NextResult())
                {
                    break;
                }
            }
        }