Automapper Project, чтобы не работать с членами ForPath - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь реализовать более элегантный вызов в моем хранилище, используя .ProjectTo<> в Automapper вместо получения IEnumerable и затем отображая эти результаты в Dto.Когда я переключился на этот метод, мое отображение больше не работает для всего, что отображается с помощью .ForPath().

Отображение:

//Context.Account -> Account
configuration.CreateMap<Context.Account, Account>()
    .ForPath(dest => dest.BillingAddress, opt => opt.MapFrom(source => new Address(source.BillingStreet, source.BillingCity, source.BillingState, source.BillingPostalCode, source.BillingCountry)))
    .ForPath(dest => dest.ShippingAddress, opt => opt.MapFrom(source => new Address(source.ShippingStreet, source.ShippingCity, source.ShippingState, source.ShippingPostalCode, source.ShippingCountry)))
    .ForMember(dest => dest.Events, opt => opt.Ignore())
    .ReverseMap()
    .ForMember(dest => dest.BillingStreet, opt => opt.MapFrom(source => source.BillingAddress.Street))
    .ForMember(dest => dest.BillingCity, opt => opt.MapFrom(source => source.BillingAddress.City))
    .ForMember(dest => dest.BillingState, opt => opt.MapFrom(source => source.BillingAddress.State))
    .ForMember(dest => dest.BillingPostalCode, opt => opt.MapFrom(source => source.BillingAddress.PostalCode))
    .ForMember(dest => dest.BillingCountry, opt => opt.MapFrom(source => source.BillingAddress.Country))
    .ForMember(dest => dest.ShippingStreet, opt => opt.MapFrom(source => source.ShippingAddress.Street))
    .ForMember(dest => dest.ShippingCity, opt => opt.MapFrom(source => source.ShippingAddress.City))
    .ForMember(dest => dest.ShippingState, opt => opt.MapFrom(source => source.ShippingAddress.State))
    .ForMember(dest => dest.ShippingPostalCode, opt => opt.MapFrom(source => source.ShippingAddress.PostalCode))
    .ForMember(dest => dest.ShippingCountry, opt => opt.MapFrom(source => source.ShippingAddress.Country));

Вот код в моем хранилище:

ДО ( Заполняемый адрес ):

List<Account> accounts;

IQueryable<Context.Account> iqueryable = _dbContext.Set<Context.Account>();

if (spec != null)
{
    var filter = Mapper.Map<Expression<Func<Context.Account, bool>>>(spec.FilterCriteria);
    iqueryable = iqueryable.Where(filter);

    if (spec is Paging<Account> paging)
    {
        var orderByExpression = Mapper.Map<Expression<Func<Context.Account, object>>>(paging.OrderBy);
        iqueryable = iqueryable.OrderBy(orderByExpression).Take(paging.Take).Skip(paging.Skip);
    }
}

accounts = iqueryable
   .ToList()
   .Select(x => Mapper.Map<Account>(x))
   .ToList();

return accounts;

ПОСЛЕ ( Адрес не заполняется ):

IQueryable<Account> iqueryable = _dbContext.Set<Context.Account>()
                .ProjectTo<Account>();

if (spec != null)
{
   if (spec is Paging<Account> paging)
   {
      iqueryable = paging.Prepare(iqueryable);
   }
   else
   {
      iqueryable = iqueryable.Where(spec.FilterCriteria);
   }
}
return iqueryable.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...