IDataReader - ToEntities
Enumerates to entities in this collection.
public static void Main() { string sql = "SELECT 1 AS IntColumn, 'FizzBuzz' AS StringColumn UNION SELECT 2, 'BuzzBuzz'"; IEnumerable<TestObject> result; using (var conn = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer())) { conn.Open(); using (DbCommand command = conn.CreateCommand()) { command.CommandText = sql; using (IDataReader reader = command.ExecuteReader()) { //C# Extension Method: IDataReader - ToEntities result = reader.ToEntities<TestObject>(); } } } List<TestObject> list = result.ToList(); FiddleHelper.WriteTable(list); } public class TestObject { public int IntColumn { get; set; } public string StringColumn { get; set; } }
View Source
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; public static partial class Extensions { /// <summary> /// Enumerates to entities in this collection. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">The @this to act on.</param> /// <returns>@this as an IEnumerable<T></returns> public static IEnumerable<T> ToEntities<T>(this IDataReader @this) where T : new() { Type type = typeof (T); PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); var list = new List<T>(); var hash = new HashSet<string>(Enumerable.Range(0, @this.FieldCount) .Select(@this.GetName)); while (@this.Read()) { var entity = new T(); foreach (PropertyInfo property in properties) { if (hash.Contains(property.Name)) { Type valueType = property.PropertyType; property.SetValue(entity, @this[property.Name].To(valueType), null); } } foreach (FieldInfo field in fields) { if (hash.Contains(field.Name)) { Type valueType = field.FieldType; field.SetValue(entity, @this[field.Name].To(valueType)); } } list.Add(entity); } return list; } }