@OwDafuq

AutoMapper и спецификация, почему не работает?

Использую AutoMapper 12.0.1, LinqSpec 3.2.0

Описал спецификацию для выборки, чтобы можно было переиспользовать и в AutoMapper, но получаю ошибку:
Unable to create a map expression from . (System.Linq.Expressions.Expression`1[System.Func`2[IdentityServer.Domain.Models.Identity.KvcApplicationRole,System.Boolean]]) to Boolean.CanBeDeleted (System.Boolean)

Mapping types:
KvcApplicationRole -> RoleDto
IdentityServer.Domain.Models.Identity.KvcApplicationRole -> IdentityServer.Core.DTOs.RoleDto

Type Map configuration:
KvcApplicationRole -> RoleDto
IdentityServer.Domain.Models.Identity.KvcApplicationRole -> IdentityServer.Core.DTOs.RoleDto

Destination Member:
CanBeDeleted


Сам маппинг описан так:
CreateMap<KvcApplicationRole, RoleDto>()
    .ForMember(x => x.RoleId, x => x.MapFrom(m => m.Id))
    .ForMember(x => x.GroupId, x => x.MapFrom(m => m.GroupId ?? 0))
    .ForMember(x => x.GroupName, x => x.MapFrom(m => GetGroupName(m.Group)))
    .ForMember(x => x.CanBeDeleted, x => x.MapFrom(m => RoleSpecs.CanDelete));

При этом, если убрать спецификацию и написать тот же код, который в ней руками, то всё работает как должно.


m => RoleSpecs.CanDelete.ToExpression().Compile().Invoke(m) тоже не работает


Полный код, который воспроизводит проблему (#r - для RoslynPad):
#r "nuget: AutoMapper, 12.0.1"
#r "nuget: LinqSpecs, 3.2.0"

using AutoMapper;
using LinqSpecs;

var mapper = new MapperConfiguration(x => x.AddProfile<MyProfile>()).CreateMapper();

var first = new First
{
    CanDelete = true,
    Childs = new List<FirstChild> { new FirstChild() }
};

var map = mapper.Map<Second>(first);
map.Dump();

class MyProfile : Profile
{
    private readonly Specification<First> spec = new AdHocSpecification<First>(x => !x.Childs.Any() && x.CanDelete);

    public MyProfile()
    {
        CreateMap<First, Second>()
            .ForMember(x => x.CanDeleted, x => x.MapFrom(m => spec));
    }
}

class First
{
    public bool CanDelete { get; set; }
    public List<FirstChild> Childs { get; set; }
}

class FirstChild
{

}

class Second
{
    public bool CanDeleted { get; set; }
}
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@OwDafuq Автор вопроса
Решение:
x.MapFrom(RoleSpecs.CanDelete.ToExpression())
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы