Использование 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 9

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