AutoMapper Ignore item in collection based on property value in source

I am mapping ApplianceViewModel with ApplianceDTO. Each device has a set of ActionViewModels that map to ActionDTO. What I would like to do is set up the display to ignore ActionViewModels whose IsPersisted value is False.

My ViewModel classes ...

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
}

My DTO classes ...

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

public class ActionDTO
{
    // properties removed for simplicity
}

I set my mapping as follows:

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);

Currently, my applianceDTO application will have two elements in the Actions collection, but I would like to configure my mapping so that the ApplianceActionViewModel property with IsPersisted set to false is not displayed. Can I do it?

Update

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>();
+3
1

- :

Mapper.map(objects.Where(o => o.IsPersisted == true))
0

Source: https://habr.com/ru/post/1752713/


All Articles