Проблема сопоставления выражений Automapper - PullRequest
0 голосов
/ 27 декабря 2018

Отображение выражения с использованием AutoMapper.Extensions.Expression не отображает выражение.

Вот мои модели:

public class UserDto
{
    public int Id { get; set; }
    public User User { get; set; }
    //other info
}

public class User
{
    public string Email { get; set; }
    //other info
}


public class UserEntity
{
    public int Id { get; set; }
    public string Email { get; set; }
    //other info
}

Мои средства отображения:

public static class MapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile(new UserDtoProfile());
        });
    }
}

internal class UserDtoProfile : Profile
{
    public UserDtoProfile()
    {
        CreateMap<UserDto, UserEntity>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.User.Email));

        CreateMap<UserEntity, UserDto>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.User, opt => opt.MapFrom(src => Mapper.Map<UserEntity>(src)));

        CreateMap<UserEntity, User>()
           .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)).ReverseMap();
    }
}

Добавить фрагментчтобы воспроизвести проблему:

static void Main(string[] args)
{
    MapperConfiguration.Configure();
    var email = "test@test.com";
    Expression<Func<UserDto, bool>> filterExpression = x => x.User.Email == email;
    var expression = Mapper.Map<Expression<Func<UserEntity, bool>>>(filterExpression);
    Console.WriteLine("Old Expression : " + filterExpression.Body);
    Console.WriteLine("New Expression : " + expression.Body);
    Console.Read();
}

Вывод этого:

Старое выражение: (x.User.Email == "asd")
Новое выражение:(x.User.Email == "asd")

Однако я ожидаю, что он выведет:

Старое выражение: (x.User.Email == "asd")
Новое выражение: (x.Email == "asd")

Конкретные строки, которые не работают должным образом:

Expression<Func<UserDto, bool>> filterExpression = x => x.User.Email == email;
var expression = Mapper.Map<Expression<Func<UserEntity, bool>>>(filterExpression);

Я использую AutoMapper v8.0.0 и AutoMapper.Extensions.Expression v2.0.0

1 Ответ

0 голосов
/ 28 декабря 2018

Вы забыли настроить отображение Expression.Ваша настройка должна быть:

Mapper.Initialize(cfg =>
{
    cfg.AddExpressionMapping();
    cfg.AddProfile(new UserDtoProfile());
});

Я на самом деле не использовал AutoMapper и никогда не использовал отображение выражений, но согласно этой проблеме github , отображение кажется обратным длявыражения.Ваше текущее отображение не будет работать, и будет зависать при выполнении.Вам нужно изменить отображение так:

internal class UserDtoProfile : Profile
{
    public UserDtoProfile()
    {
        CreateMap<UserDto, UserEntity>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.User.Email))
            .ReverseMap();

        CreateMap<UserEntity, User>()
           .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)).ReverseMap();
    }
}

Запуск этого дает вывод:

Старое выражение: (x.User.Email == "asd")
Новое выражение: (x.Email == "asd")

...