AutoMapper Игнорировать элемент в коллекции на основе значения свойства в источнике - PullRequest
3 голосов
/ 02 июля 2010

Я сопоставляю ApplianceViewModel с ApplianceDTO.Каждое устройство имеет коллекцию ActionViewModels, которые сопоставлены с ActionDTO.Я хотел бы настроить маппер на игнорирование ActionViewModels, значение IsPersisted которого равно False.

Мои классы ViewModel ...

public interface IApplianceViewModel : INotifyPropertyChanged
{
    ObservableCollection<IActionViewModel> Actions { get; set; }
    // other properties removed for simplicity
}

public interface IActionViewModel : INotifyPropertyChanged
{
    bool IsPersisted { get; set; }
    // other properties removed for simplicity
}

Мои классы DTO ...

public class ApplianceDTO
{
    public IEnumerable<ActionDTO> Actions { get; set; }
    // other properties removed for simplicity
}

public class ActionDTO
{
    // properties removed for simplicity
}

Я настроил свое отображение следующим образом ...

Mapper.CreateMap<IApplianceViewModel, ApplianceDTO>();
Mapper.CreateMap<IActionViewModel, ActionDTO>()

var appliance = new ApplianceViewModel {
    Actions = new ObservableCollection<IActionViewModel>(
        new List<IActionViewModel> {
           new ActionViewModel { IsPersisted = true },
           new ActionViewModel { IsPersisted = false }
    }};
var applianceDTO = Mapper.Map<IApplianceViewModel, ApplianceDTO>(applianceDTO);

В настоящее время у моего applianceDTO будет два элемента в его коллекции Actions, но я хотел бы настроить свое отображение так, чтобыApplianceActionViewModel со свойством IsPersisted, установленным в false, не отображается.Могу ли я сделать это?

Обновление

Комментарий Omu привел меня к решению, использующему ValueResolver для сопоставления коллекции Actions.Я не очень доволен этим решением, но его лучший вариант доступен.

Сначала я создал собственный ValueResolver.

public class IsPersistedCollectionResolver : ValueResolver<IApplianceViewModel, IEnumerable<ActionDTO>>
{
    protected override IEnumerable<ActionDTO> ResolveCore(IApplianceViewModel source)
    {
        return Mapper.Map<IEnumerable<IActionViewModel>, IEnumerable<ActionDTO>>(source.Actions.Where(x => x.IsPersisted));
    }
}

Затем я изменил свой код, чтобы использовать его в конфигурации сопоставления..

Mapper.CreateMap<IApplianceViewModel, ApplianceDTO>()
    .ForMember(dest => dest.Actions, opt => opt.ResolveUsing<IsPersistedCollectionResolver>());
Mapper.CreateMap<IActionViewModel, ActionDTO>();

1 Ответ

0 голосов
/ 07 июля 2010

вы пытались сделать что-то вроде:

Mapper.map(objects.Where(o => o.IsPersisted == true))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...