2017-02-17 2 views
0

Мне нужно написать сопоставление для объекта в его DTO для указания цели и подробного представления объекта. Но для перечисления мне нужно игнорировать свойство списка из-за DTO, потому что я не хочу его загружать, я включил Lazy load в Entity framework. Как создать два сопоставления одного и того же объекта или добавить игнорировать свойство при запросе данных для просмотра списка.Как мы можем создать различное сопоставление для одного и того же объекта в automapper

cfg.CreateMap<page, PageViewModel>().ForMember(t => t.PageRows, opts => opts.MapFrom(s => s.page_rows)). 
      ForMember(t => t.PageRules, opts => opts.MapFrom(s => s.page_rules.Select(x => x.rule_id))); 

cfg.CreateMap<page, PageViewModel>().ForMember(t => t.PageRows, opts => opts.Ignore()). 
      ForMember(t => t.PageRules, opts => opts.MapFrom(s => s.page_rules.Select(x => x.rule_id))); 
+0

Вы должны создать два различных типа DTO для вашей организации. – Shad

+0

так что нет другого решения :(? –

+0

Почему вы не хотите создавать отдельные DTO? – Amy

ответ

1

Вы должны создать два различных класса DTO для сопоставления. Если вы не хотите этого делать, у вас также есть другой вариант, который должен был бы создать два интерфейса-маркера и отобразить их.

2

Вы можете настроить Precondition с Func<ResolutionContext, bool>, а затем использовать метод Map перегруженные с Action<IMappingOperationOptions> передать контрольный параметр через Items словаря.

Например:

.ForMember(t => t.PageRows, opts => 
{ 
    opts.MapFrom(s => s.page_rows); 
    opts.PreCondition(context => !context.Items.ContainsKey("IgnorePageRows")); 
}) 

, а затем:

IEnumerable<page> source = ...; 
var withPageRows = Mapper.Map<List<PageViewModel>>(source); 
var noPageRows = Mapper.Map<List<PageViewModel>>(source, 
    opts => opts.Items.Add("IgnorePageRows", null)); 

Ссылка: Conditional mapping

Смежные вопросы