Я пытаюсь реализовать более элегантный вызов в моем хранилище, используя .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();