来自LINQ join的 Mapperly会忽略后续的对象属性映射

编程语言 2026-07-09

我在用Mapperly将一个DTO映射时遇到了困难,它的源对象来自两个对象的JOIN。

public class A
{
    public int Id { get; set; }
    public string AA { get; set; }
}
public class B
{
    public int AId { get; set; }
    public string BB { get; set; }
}
public class TheDTO
{
    public string AA { get; set; }
    public string BB { get; set; }
}

[Mapper]
public partial class TheDtoMapper
{
    public partial TheDTO Map(A a, B b);
}

然后我按如下方式调用映射:

List<A> AA = new List<A> 
{
    new A { Id = 1, AA = "alpha" }, 
    new A { Id = 2, AA = "beta" } 
};
List<B> BB = new List<B> 
{ 
    new B { AId = 1, BB = "gamma" },
    new B { AId = 2, BB = "delta" } 
};

var mapper = new TheDtoMapper();
var result = AA
    .Join(BB, (a) => a.Id, (b) => b.AId, (a, b) => new { a, b })
    .Select(x => mapper.Map(x.a, x.b))
    .ToList();

结果DTO的第一个对象(A)映射正确,但它忽略了 BB

我正在使用.NET 8和 Mapperly 4.3.1。

解决方案

你的当前场景如同在这个 Mapperly的 GitHub问题 中所建议的那样,但遗憾的是此功能尚未有更新。

不过,你可以通过 合并对象 来实现你自己的映射逻辑,以便与多个来源进行合并。

你的 TheDtoMapper 类应如下:

[Mapper]
public partial class TheDtoMapper
{
    public partial TheDTO MapAToDto(A a);
    public partial void MergeBToDto(B b, TheDTO dto);

    public TheDTO Map(A a, B b)
    {
        var dto = MapAToDto(a);

        MergeBToDto(b, dto);

        return dto;
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章