我遇到了一种情况,我从API获取了一些有关旅行的数据.我正在使用AutoMapper将此"API模型"映射到EF Core实体,以存储在我的SQL服务器数据库中.

大多数映射都很简单,但我遇到了一种情况:TripModel有一个名为ReasonForTravel属性,它是一个int?值-如果它有一个值,且该值是> 0,那么我想使用自定义ValueConverterint转换为我需要的字符串-但如果ReasonForTravel根本没有值,或者它是<= 0,那么我想从CustomTravelReasonTripModel上取值.

如何在AutoMapper CreateMap中表达这一点,以便我可以一步映射我的TripModelTrip实体?

这是我的代码-模型、实体和AutoMapper Profile:

public class TripModel
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public int? ReasonForTravel { get; set; }
    public string CustomTravelReason { get; set; }
    // more stuff, but irrelevant here
}

public class Trip
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string ReasonForTrip { get; set; }
}

public class TripProfile : Profile
{
    public TripProfile()
    {
        CreateMap<TripModel, Trip>
            // I know these two aren't strictly necessary - just for illustration of what I'm doing
            .ForMember(dest => dest.Firstname, opt => opt.MapFrom(src => src.Firstname))
            .ForMember(dest => dest.Lastname, opt => opt.MapFrom(src => src.Lastname))
            
            // but how do I specify this now?? This is for the case of ReasonForTravel > 0
            .ForMember(dest => dest.ReasonForTrip, opt => opt.ConvertUsing(new TravelReasonConverter(), src => src.Lastname))

            // and this is for the case of ReasonForTravel <= 0 or ReasonForTravel = null
            .ForMember(dest => dest.ReasonForTrip, opt => opt.MapFrom(src => src.CustomTravelReason));
    }
}

推荐答案

有一个MapFrom超载,允许传递Func,您可以向其中指定if/else判断.不幸的是,它不能与ConvertUsing结合使用,但您可以自己称该转换器.

或者,您可以 Select 使用常规函数来进行转换,而不是使用转换器.

CreateMap<TripModel, Trip>()
    // Other mappings
    // ...
    .ForMember(dest => dest.ReasonForTrip,
        opt => opt.MapFrom((src, dest, member, resolutionContext) =>
            src.ReasonForTravel > 0 
                ? new TravelReasonConverter().Convert(src.ReasonForTravel, resolutionContext) 
                  // or call a function returning a string. 
                : src.CustomTravelReason
        ));
        
public class TravelReasonConverter : IValueConverter<int?, string>
{
    public string Convert(int? sourceMember, ResolutionContext context)
        => "some converted value";    
}

Csharp相关问答推荐

C#中的包版本控制

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

使用命令初始化可绑定属性

Unity中的刚体2D运动

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

Rider将.NET安装在哪里

更改执行目录

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

为什么AggregateException的Catch块不足以处理取消?

数据库.Migrate在对接容器重启时失败

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

在Unity C#中按键点击错误的参数

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

用于分钟和秒验证的MudTextfield的正则表达式掩码

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

如何处理ASP.NET Core中包含两个构造函数的控制器?

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

带有类约束的C#泛型