AutoMapper со списком данных из IDataReader - PullRequest
2 голосов
/ 29 июля 2011
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имеет больше чем одну строку, он запускается ок .

любая помощь?

Ответы [ 2 ]

7 голосов
/ 29 июля 2011

Проблема в том, что 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;
    }
0 голосов
/ 19 сентября 2017

Добавьте 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());
...