Использование 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
, на который вы ссылались, был помечен как устаревший в последней версии библиотеки, поэтому вы можете не использовать его.