首页 > 解决方案 > 不应用 AutoMapper 投影

问题描述

我正在尝试创建一个框架来抽象我的实体层,但是要使其工作,我需要自动映射器项目才能工作,这样我就可以查询我的 DTO 而不是查询实体

[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?

标签: c#.net-coreautomapperprojection

解决方案


MapFrom 的 3 参数重载需要赋值。这可以通过使用 2 参数重载来解决。

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

推荐阅读