Использование automapper для применения фильтра к коллекции
У меня есть модель домена, которая содержит коллекцию, и я хочу использовать AutoMapper для сопоставления родительского и дочернего элементов с моделью просмотра, но я не хочу, чтобы дети были "мягкими" удаленными, чтобы их можно было перехватить. Например:
public class Customer {
public EntitySet<Order> {get;set;}
}
public class Order {
public DateTime? DeletedDate {get;set;}
}
мое определение AutoMapper будет
Mapper.CreateMap<Customer, CustomerViewModel>();
Mapper.CreateMap<Order, OrderViewModel>();
и я не хочу, чтобы Orders находились в модели представления, которая имеет значение для DeletedDate.
Возможно ли это в AutoMapper? Большое спасибо заранее,
Steve.
Ответы
Ответ 1
Я столкнулся с подобной проблемой, и, наконец, подход, подобный приведенному ниже, работал у меня:
Mapper.CreateMap<Customer, CustomerViewModel>()
.ForMember(dest => dest.Orders,
opt => opt.MapFrom(src => src.Orders.Where(o => !o.DeletedDate.HasValue)));
Это предполагает, что ваш объект Customer и CustomerViewModel имеют коллекции с именами "Заказы".
Ответ 2
Похоже, это было бы хорошо для настраиваемого ValueResolver. Это позволит вам делать свои логические проверки изолированным образом. У меня нет Visual Studio передо мной прямо сейчас, но я могу добавить образец кода позже, если вы захотите.
ИЗМЕНИТЬ:
После этого я не думаю, что ValueResolver - это путь. Я смог заставить его работать, используя следующую условную конфигурацию для отображения Order
:
Mapper.CreateMap<Order, OrderViewModel>()
.ForAllMembers(opt => opt.Condition(src => !src.DeletedDate.HasValue));
Единственное, что с этим связано, это OrderViewModel
, но это будет null
. Другими словами, если у вас было 3 заказа, а у одной была дата удаления, то количество заказов, которые вы будете иметь в вашей модели просмотра, будет по-прежнему равно 3, но удаленное значение будет null
. Я предполагаю, что было бы лучше всего иметь 2, но я не вижу ясного способа сделать это прямо сейчас.
Здесь сообщение с ответом автора AutoMapper, в котором говорится о методе Skip
, но я не смог увидеть эту функцию в последней релиз, который я использую.