До AutoMapper 8.0 я использовал этот код:
CreateMap<ApplicationRole, RoleViewModel>()
.ForMember(d => d.Permissions, map => map.MapFrom(s => s.Claims))
.ForMember(d => d.UsersCount, map => map.ResolveUsing(s => s.Users?.Count ?? 0))
.ReverseMap();
В документации сказано, что вам нужно изменить ResolveUsing на MapFrom, но у меня появляется ошибка «Нет распространения Null».
.ForMember(d => d.UsersCount, map => map.MapFrom(s => s.Users?.Count ?? 0))
Как я должен это решить?
Как говорится в документации, вам нужна перегрузка на основе Func, а не на основе выражений. docs.automapper.org/en/latest/…





Замените ResolveUsing на MapFrom и добавьте еще один входной параметр в лямбду (TDestination).
.ForMember(d => d.UsersCount, map => map.MapFrom((s,d) => s.Users?.Count ?? 0))
Вам не нужно использовать это выражение, вы можете "Users.Count", и оно вернет 0, если список пуст.
Вы можете просто удалить ResolveUsing (или MapFrom), и он будет сопоставлен по соглашению Users.Count => UsersCount.
В AutoMapper 8.0 отсутствует ResolveUsing
У меня такая же проблема, и я использую следующий прототип ResolveUsing:
void ResolveUsing(Func<TSource, TResult> mappingFunction);
Вместо замены существующего кода я предпочел создать метод расширения:
using System;
using AutoMapper;
namespace myLibrary.Extensions
{
public static class AutoMapperCompatibilityExtensions
{
// Summary:
// Resolve destination member using a custom value resolver callback. Used instead
// of MapFrom when not simply redirecting a source member This method cannot be
// used in conjunction with LINQ query projection
//
// Parameters:
// resolver:
// Callback function to resolve against source type
public static void ResolveUsing<TSource, TDestination, TMember, TResult>(this IMemberConfigurationExpression<TSource, TDestination, TMember> member, Func<TSource, TResult> resolver) => member.MapFrom((Func<TSource, TDestination, TResult>)((src, dest) => resolver(src)));
}
}
Позже в своем коде я просто сослался на пространство имен:
using myLibrary.Extensions;
...
... map.ResolveUsing(s => ...
...
Надеюсь это поможет.
Пожалуйста, простите меня, могу ли я узнать, почему я получил -1 за этот ответ? Спасибо.
Я просто поставил вам +1, потому что, если библиотека не поддерживает обратную совместимость, вполне разумно сделать это самостоятельно.
Это спасло мне день
Замечательная идея!
Убедитесь, что вы предоставили сообщение об ошибке полный, включая любые трассировки стека, если такая вещь существует для вас.