使用Linq Join后Mapperly未映射第二个对象属性的问题
解决Mapperly多参数映射时B对象属性未映射的问题
问题原因
Mapperly 默认不会自动将多参数映射方法中所有参数的属性匹配到目标DTO,它默认优先处理第一个参数的属性,因此B对象的BB属性没有被自动映射到TheDTO中。
解决方案
方案1:手动实现映射逻辑
利用Mapperly支持部分方法的特性,手动补全映射逻辑:
[Mapper] public partial class TheDtoMapper { public partial TheDTO Map(A a, B b); private TheDTO MapImpl(A a, B b) { return new TheDTO { AA = a.AA, BB = b.BB }; } }
方案2:使用[MapProperty]显式指定映射关系
通过特性明确指定目标DTO属性对应的来源参数及属性:
[Mapper] public partial class TheDtoMapper { [MapProperty(nameof(TheDTO.AA), nameof(A.AA))] [MapProperty(nameof(TheDTO.BB), nameof(B.BB))] public partial TheDTO Map(A a, B b); }
方案3:合并参数为单一对象后映射
在Join阶段将A、B的属性合并为匿名对象,再映射到DTO,简化映射方法:
// 更新映射器 [Mapper] public partial class TheDtoMapper { public partial TheDTO Map((string AA, string BB) source); } // 调用代码调整 var result = AA .Join(BB, a => a.Id, b => b.AId, (a, b) => (a.AA, b.BB)) .Select(x => mapper.Map(x)) .ToList();
以上三种方案在.NET 8 + Mapperly 4.3.1版本下均可正常工作,可根据实际场景选择合适的方式。
内容的提问来源于stack exchange,提问作者danielc
相关产品推荐
相关产品推荐

