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); } } }
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>()); }