AutoMapper Проекции не применяются - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать каркас для абстрагирования своих Entity Layers, однако, чтобы это работало, мне нужны работающие с помощью Autopper проекты, чтобы я мог запрашивать свои DTO вместо запросов к Entities

[TestMethod]
public async Task Verify_Mapping_Projection_Behavior()
{
    var projectionModifier = "Alabastar";
    var services = this.GetRegisteredRestEzServiceCollection();
    var serviceProvider = services.BuildServiceProvider();
    var context = (AstootContext)serviceProvider.GetService<DbContext>();

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, UserDTO>().ForMember(x => x.FirstName, 
            o => o.MapFrom((entity, dto) => entity.FirstName + projectionModifier));
    });

    var mapper = config.CreateMapper();

    // Hack: we'll verify exeuction happens in sql
    // using the behavioral differene between in memory and sql (case insensitivity)
    var sqlOnlyModifier = projectionModifier.ToUpper();
    var userDTO = mapper.ProjectTo<UserDTO>(context.Users)
        .Where(x => x.FirstName.Contains(sqlOnlyModifier))
        .FirstOrDefault();

    Assert.IsNotNull(userDTO);
}

Мой тест не удалось, поэтому я решил материализовать проекцию напрямую. Когда я материализуюсь, я вижу, что мои projectionModifier не добавляются в свойство firstName.

Как я могу заставить проект отобразить мой модификатор, чтобы я мог использовать свои DTO как Sql Queryables?

1 Ответ

1 голос
/ 01 мая 2020

Перегрузка с 3 параметрами для MapFrom требует назначения. Эту проблему можно решить с помощью перегрузки параметра 2.

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<User, UserDTO>()
        .ForMember(dto => dto.FirstName, 
            opt => opt.MapFrom(entity => entity.FirstName + projectionModifier));
});
...