Я пытаюсь облегчить создание выражений сопоставления в AutoMapper, используя AutoMapper.QueryableExtensions.
У меня есть следующее, что дает критический прирост производительности:
private MapperConfiguration CreateConfiguration() {
return new MapperConfiguration(cfg => cfg.CreateMap<Widget, WidgetNameDto>()
.ForMember(dto => dto.Name,
conf => conf.MapFrom(w => w.Name)));
}
Чтобы понять прирост производительности, см. здесь: https://github.com/AutoMapper/AutoMapper/blob/master/docs/Queryable-Extensions.md Суть в том, что запрос ограничен полем на уровне базы данных.
Это потрясающе, что это работает. Но я ожидаю, что мне понадобится много такого рода проектов. Я пытаюсь немного облегчить синтаксис в предложении ForMember выше.
Например, я пробовал это:
public static IMappingExpression<TFrom, TTo> AddProjection<TFrom, TTo, TField>(this IMappingExpression<TFrom, TTo> expression,
Func<TFrom, TField> from,
Func<TTo, TField> to
)
=> expression.ForMember(t => to(t), conf => conf.MapFrom(f => from(f)));
Проблема в том, что все, что я делаю, приводит к ошибке:
AutoMapper.AutoMapperConfigurationException : Custom configuration for members is only supported for top-level individual members on a type.
Даже если переданные в Funcs отдельные члены высшего уровня, этот факт теряется при передаче, поэтому я натыкаюсь на ошибку. Я также попытался изменить Func‹Whatever> на Expression‹Func‹Whatever>>. Это не помогает.
Можно ли как-то упростить синтаксис предложения ForMember? В идеале я бы просто пропустил два соответствующих поля.