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

如果 dr只有一行-> 错误:抛出类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的异常

如果 dr 有不止一排,它运行正常

有什么帮助吗?

4

2 回答 2

8

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

更改您的线路以调用 HasRows

例如

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

        return null;
    }
于 2011-07-29T15:42:33.433 回答
-2

添加 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());
于 2017-09-19T08:38:06.440 回答