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