Использование autopper для применения фильтра к коллекции - PullRequest
17 голосов
/ 03 июня 2011

У меня есть модель предметной области, которая содержит коллекцию, и я хочу использовать 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>();

и я не хочу, чтобы в модели представления были заказы со значением для DeletedDate.

Возможно ли это в AutoMapper? Большое спасибо заранее,

Стив.

Ответы [ 2 ]

27 голосов
/ 20 июня 2011

Я столкнулся с подобной проблемой, и, наконец, подход, аналогичный приведенному ниже, сработал для меня:

Mapper.CreateMap<Customer, CustomerViewModel>()
    .ForMember(dest => dest.Orders, 
        opt => opt.MapFrom(src => src.Orders.Where(o => !o.DeletedDate.HasValue)));

Это предполагает, что ваша сущность Customer и CustomerViewModel dto имеют коллекции с именем "Orders".

2 голосов
/ 03 июня 2011

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

...