Использование AutoMapper для сопоставления объекта DataTable с объектом (DTO)
Я пытаюсь сопоставить DataTable объекту (DTO)с помощью функции Automappers DynamicMap.
DataTable dt;
dt = new dalAllInvestors().InvestorNameSearch(investorNameSearch);
// Look at DynamicMap - Urgent
List<dtoAPISimpleInvestor> apiObject = AutoMapper.Mapper.DynamicMap<IDataReader, List<dtoAPISimpleInvestor>>(
dt.CreateDataReader());
return apiObject;
public class dtoAPISimpleInvestor
{
public int FirmID { get; set; }
public string FirmName { get; set; }
public string Type { get; set; }
public string Location { get; set; }
}
dt возвращает 10 строк, но когда вы смотрите на apiObject, он не возвращает строк, и это, кажется, не имеет никакого смысла. Я смотрел на это уже некоторое время, и после того, как погуглил, похоже, что я делаю это правильно.
Правильные столбцы находятся в dt, когда его возвращение, которое соответствует dtoAPISimpleInvestor
Может кто-то пожалуйста, помогите мне?
1 ответ:
Как насчет чего-то вроде следующего...
Профиль Автомата
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; // } }Примечание : я использую тип
DataRowв качестве источника, а неIDataReader(Подробнее об этом ниже).Использование профиля
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);Объект
resultдолжен содержать правильное число объектовdtoAPISimpleInvestorс правильными данными.Примечание : вызов
mapper.Mapпринимает объект типаList<DataRow>, который может быть получен из объектаDataTableс помощью утверждениеnew List<DataRow>(dataTable.Rows.OfType<DataRow>());(поскольку свойствоRowsобъектаDataTableявляется коллекцией, реализующейIEnumerable, но неIEnumerable<T>).Это, вероятно, не единственное решение, но я проверил, что оно работает.
В качестве примечания я заметил, что метод
DynamicMap, на который вы ссылались, был помечен как устаревший в последней версии библиотеки, поэтому вы можете не использовать его.