How about the following ...
AutoMapper Profile
public sealed class SimpleInvestorProfile : Profile { // This is the approach starting with version 5 public SimpleInvestorProfile() { IMappingExpression<DataRow, dtoAPISimpleInvestor> mappingExpression; mappingExpression = CreateMap<DataRow, dtoAPISimpleInvestor>(); mappingExpression.ForMember(d => d.FirmID, o => o.MapFrom(s => s["FirmID"])); mappingExpression.ForMember(d => d.FirmName, o => o.MapFrom(s => s["FirmName"])); mappingExpression.ForMember(d => d.Type, o => o.MapFrom(s => s["Type"])); mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"])); } // this method is obsolete in version 5 // protected override void Configure() // { // IMappingExpression<DataRow, dtoAPISimpleInvestor> mappingExpression; // mappingExpression = CreateMap<DataRow, dtoAPISimpleInvestor>(); // mappingExpression.ForMember(d => d.FirmID, o => o.MapFrom(s => s["FirmID"])); // mappingExpression.ForMember(d => d.FirmName, o => o.MapFrom(s => s["FirmName"])); // mappingExpression.ForMember(d => d.Type, o => o.MapFrom(s => s["Type"])); // mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"])); // return; // } }
NOTE. I use the DataRow type as the source, not IDataReader (more on this below).
Profile Usage
MapperConfiguration configuration; configuration = new MapperConfiguration(a => {a.AddProfile(new SimpleInvestorProfile());}); IMapper mapper; mapper = configuration.CreateMapper(); List<dtoAPISimpleInvestor> result; result = mapper.Map<List<DataRow>, List<dtoAPISimpleInvestor>>(rows);
The result object must contain the correct number of dtoAPISimpleInvestor objects with the correct data.
NOTE. Calling mapper.Map calls an object of type List<DataRow> , which can be obtained from the DataTable using the new List<DataRow>(dataTable.Rows.OfType<DataRow>()); (since the Rows property of a DataTable is a collection that implements IEnumerable but not IEnumerable<T> ).
This is most likely not the only solution, but I confirmed that it works.
As a side note, I noticed that the DynamicMap method that you referenced was marked as deprecated in the latest version of the library, so you can avoid using it.
Jason richmeier
source share