Использую 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; }
}