internal static IEnumerable <T> ToEntities <T>(this DbDataReader dataReader, ICommand iCommand) where T : class, new() { if (dataReader == null || !dataReader.HasRows) { return(null); } var type = typeof(T); var properties = CacheHelper.GetTypePropertyInfos(type.FullName); if (properties == null) { properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); // cache type PropertInfos if (properties != null) { CacheHelper.AddTypePropertyInfos(type.FullName, properties); } } var list = new List <T>(); while (dataReader.Read()) { var entity = new T(); for (int i = 0; i < dataReader.FieldCount; i++) { var columnName = dataReader.GetName(i); var property = properties.FirstOrDefault(x => x.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); //# if exact match failed, then try remove under-score of column and match again //# by this way, column first_name can map to property FirstName if (property == null) { property = properties.FirstOrDefault(x => x.Name.Equals(columnName.Replace("_", ""), StringComparison.OrdinalIgnoreCase)); } if (property != null) { //property.SetValue(entity, dataReader[i]); SetPropertyValue <T>(entity, property, dataReader, i, iCommand); } } list.Add(entity); } return(list.AsEnumerable()); }