示例#1
0
        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());
        }