具有不同源类型的 Automapper 条件映射
Automapper conditional mapping with different source types
我正在尝试从源实体的几个不同导航属性之一映射到 DTO 中的自定义类型 属性,条件是其中一个不为空。
简化版(删除了一些有条件的地图):
CreateMap<MyDTO, MyEntity>()
.ForMember(dest => dest.Order,
opt =>
{
opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
src.OrderType2 != null ? src.OrderType2 : null
));
它不会编译,因为 OrderType2 实体的类型与 OrderType1 不同
Type of conditional expression cannot be determined because there is
no implicit conversion between 'OrderType1' and 'OrderType2'
我试过创建一个空类型,让两个实体类型都继承自该类型,然后转换为条件表达式中的基类型。这将引发异常,因为它具有所有属性的未映射类型。
假设我可以重构以在整个导航属性上使用基础 class 并为每个实体创建从基础到派生的映射以使其正常工作,但感觉它会引入太多变化。
是否有使用 Automapper 的替代方法或其他解决问题的方法 - 有多个条件可以 return 映射不同的源类型?
这看起来太简单了,但通过在条件中转换为对象使其工作:
CreateMap<MyDTO, MyEntity>()
.ForMember(dest => dest.Order,
opt =>
{
opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
src.OrderType2 != null ? (object)src.OrderType2 : null
));
这会运行并创建所有必需的地图。
我正在尝试从源实体的几个不同导航属性之一映射到 DTO 中的自定义类型 属性,条件是其中一个不为空。
简化版(删除了一些有条件的地图):
CreateMap<MyDTO, MyEntity>()
.ForMember(dest => dest.Order,
opt =>
{
opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
src.OrderType2 != null ? src.OrderType2 : null
));
它不会编译,因为 OrderType2 实体的类型与 OrderType1 不同
Type of conditional expression cannot be determined because there is no implicit conversion between 'OrderType1' and 'OrderType2'
我试过创建一个空类型,让两个实体类型都继承自该类型,然后转换为条件表达式中的基类型。这将引发异常,因为它具有所有属性的未映射类型。
假设我可以重构以在整个导航属性上使用基础 class 并为每个实体创建从基础到派生的映射以使其正常工作,但感觉它会引入太多变化。
是否有使用 Automapper 的替代方法或其他解决问题的方法 - 有多个条件可以 return 映射不同的源类型?
这看起来太简单了,但通过在条件中转换为对象使其工作:
CreateMap<MyDTO, MyEntity>()
.ForMember(dest => dest.Order,
opt =>
{
opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
src.OrderType2 != null ? (object)src.OrderType2 : null
));
这会运行并创建所有必需的地图。