コード例 #1
0
        internal static Tuple <IEnumerable <T>, IEnumerable <U>, IEnumerable <V>, IEnumerable <W>, IEnumerable <X> > ToMultipleTypes <T, U, V, W, X>(DbDataReader dr, bool forAnonymousTypes = false)
        {
            // Dataset #0 for type T
            var dataset0       = ToPrimitiveOrTypeOrDynamic <T>(dr);
            var hasNextResult0 = dr.NextResult();

            // Dataset #1 for type U
            var dataset1       = hasNextResult0 ? ToPrimitiveOrTypeOrDynamic <U>(dr) : null;
            var hasNextResult1 = hasNextResult0 ? dr.NextResult() : false;

            // Dataset #2 for type V
            var dataset2       = hasNextResult1 ? ToPrimitiveOrTypeOrDynamic <V>(dr) : null;
            var hasNextResult2 = hasNextResult1 ? dr.NextResult() : false;

            // Dataset #3 for type W
            var dataset3       = hasNextResult2 ? ToPrimitiveOrTypeOrDynamic <W>(dr) : null;
            var hasNextResult3 = hasNextResult2 ? dr.NextResult() : false;

            // Dataset #4 for type X
            var dataset4       = hasNextResult3 ? ToPrimitiveOrTypeOrDynamic <X>(dr) : null;
            var hasNextResult4 = hasNextResult3 ? dr.NextResult() : false;

            // Return
            return(new Tuple <IEnumerable <T>, IEnumerable <U>, IEnumerable <V>, IEnumerable <W>, IEnumerable <X> >
                   (
                       dataset0,
                       dataset1,
                       dataset2,
                       dataset3,
                       dataset4
                   ));

            // Depending of type of T, gets the Primitive, Dynamic or Typed data.
            IEnumerable <MyType> ToPrimitiveOrTypeOrDynamic <MyType>(DbDataReader datareader)
            {
                // Primitive type: Executable<string>()
                if (TypeExtension.IsPrimitive(typeof(MyType)))
                {
                    return(DataReaderConvertor.ToPrimitives <MyType>(datareader));
                }

                // Dynamic type: Executable<dynamic>()
                else if (DynamicConvertor.IsDynamic(typeof(MyType)))
                {
                    return(DataReaderConvertor.ToDynamic <MyType>(datareader));
                }

                // Anonymous type: Executable(new { Name = "" })
                else if (forAnonymousTypes == true)
                {
                    return(DataReaderConvertor.ToAnonymous <MyType>(datareader));
                }

                // Object type: Executable<Employee>()
                else
                {
                    return(DataReaderConvertor.ToType <MyType>(datareader).Rows);
                }
            }
        }
コード例 #2
0
        internal static IEnumerable <T> ToDynamic <T>(DbDataReader reader)
        {
            bool hasRow = reader.Read();

            // No data
            if (!hasRow)
            {
                return(new T[0]);
            }

            // DataTable Columns
            var columns = Enumerable.Range(0, reader.FieldCount)
                          .ToDictionary(i => reader.GetName(i),
                                        i => reader.IsDBNull(i)
                                                           ? typeof(Nullable <>).MakeGenericType(reader.GetFieldType(i))
                                                           : reader.GetFieldType(i));

            // Get Type
            var type = DynamicConvertor.GetDynamicType(DynamicConvertor.DYNAMIC_CLASS_NAME, columns);

            // Class Properties
            var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            // Convert all rows
            var rows = new List <object>();

            do
            {
                var newItem = Activator.CreateInstance(type);
                for (int i = 0; i < columns.Count; i++)
                {
                    PropertyInfo property = properties[i];
                    object       value    = reader.GetValue(i);

                    SetPropertyWithNullMapping(newItem, property, value);
                }
                rows.Add(newItem);
            } while (reader.Read());

            // Return
            return(rows.Cast <T>());
        }