开发者

AutoMapper with a list data from IDataReader

开发者 https://www.devze.com 2023-03-24 00:13 出处:网络
using (IDataReader dr = DatabaseContext.ExecuteReader(command)) { if (dr.Read()) { AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>();
using (IDataReader dr = DatabaseContext.ExecuteReader(command))
        {
            if (dr.Read())
            {
                AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>();
 开发者_如何学运维               return AutoMapper.Mapper.Map<IDataReader, IList<ProductModel>>(dr);
            }
            return null;
        }

if dr has only one row -> error: threw an exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'

if dr has more than one row, it run ok.

any help?


The problem is that Automapper is calling Read() as well - so is trying to always look at the second record onwards. If you think about it if you have 1000 rows in the reader - how is AutoMapper going to convert that to a list without iterating through them all calling Read()?

Change your line to call 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;
    }


Add AutoMapper.Net4 and add the mappers ahead of CreateMap as below:

    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());
0

精彩评论

暂无评论...
验证码 换一张
取 消