2011-07-29 64 views
1
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」AutoMapper從IDataReader的

如果博士更多比一排,它運行ok

有幫助嗎?

回答

6

問題是,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

感謝,你可是...... AutoMapper.Mapper.CreateMap >( );或AutoMapper.Mapper.CreateMap ();是對的?我看到他們倆都在工作! – vNext

+1

我總是更喜歡更明確,所以IList 。它可能會有一些魔力,所以它在內部並不重要。 –

0

添加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());