AutoMapper,带有来自IDataReader的列表数据

时间:2011-07-29 13:24:04

标签: c# automapper idatareader

using (IDataReader dr = DatabaseContext.ExecuteReader(command))
        {
            if (dr.Read())
            {
                AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>();
                return AutoMapper.Mapper.Map<IDataReader, IList<ProductModel>>(dr);
            }
            return null;
        }

如果博士只有一行 - >错误:引发类型'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'的异常

如果博士 超过一行,则运行确定

任何帮助?

2 个答案:

答案 0 :(得分:7)

问题是Automapper也在调用Read() - 所以试图始终查看第二条记录。如果您在阅读器中有1000行时考虑一下 - AutoMapper如何将其转换为列表而不通过它们遍历所有调用Read()?

更改您的线路以调用HasRows

e.g。

using (IDataReader dr = DatabaseContext.ExecuteReader(command))
    {
        if (dr.HasRows)
        {
            AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>();
            return AutoMapper.Mapper.Map<IDataReader, IList<ProductModel>>(dr);
        }

        return null;
    }

答案 1 :(得分:-1)

添加AutoMapper.Net4并在CreateMap之前添加映射器,如下所示:

    MapperRegistry.Mappers.Add(new DataReaderMapper());
    MapperRegistry.Mappers.Add(new NameValueCollectionMapper());
    MapperRegistry.Mappers.Add(new HashSetMapper());
    MapperRegistry.Mappers.Add(new ListSourceMapper());
    MapperRegistry.Mappers.Add(new TypeConverterMapper());