使用自动映射器覆盖现有映射

本文关键字:映射 覆盖 | 更新日期: 2023-09-27 17:56:44

我有以下实体和视图模型:

public class Report
{
    public int? Day { get; set; }
    public int? Week { get; set; }
    public int? Month { get; set; }
    public int Year { get; set; }
}
public class ReportViewModel
{
    public int Value { get; set; }
    public int Year { get; set; }
}

为了映射这一点,我目前正在使用以下方法。

Mapper.Initialize(c =>
        {
            c.CreateMap<Report, ReportViewModel>();
        }

然后选择使用 .Project.To<>

var models = Context.Project().To<ReportViewModel>().ToList();

我的问题是我正在将枚举传递给此查询,该查询告诉我值是否需要为月、周或日。

public enum ReportingPeriod
{
    None = 0,
    Monthly = 1,
    Weekly = 2,
    Daily = 4
}

如何根据传递的枚举将 Value 属性的映射设置为动态映射?

我尝试在使用以下方法执行查询之前覆盖配置,但这不起作用。

Mapper.CreateMap<Report, ReportViewModel>()
                    .ForMember(src => src.Value, dest => dest.MapFrom(r => (reportingPeriod == ReportingPeriod.Monthly) ? 
                                                                                                                r.Month.Value : reportingPeriod == ReportingPeriod.Weekly ?
                                                                                                                                            r.Week.Value : r.Day.Value));

使用自动映射器覆盖现有映射

使用Automapper版本5.2.0,您的语法应如下所示。您应该使用 ResolveUsing 而不是 MapFrom 并且 swith-case 应该在大括号内。您不必使用任何 Mapper.Initialize()。我测试了这段代码,它对我有用。我希望它对您也有帮助。干杯。

这里问了类似的问题。 请看先生的回答

   var config = new MapperConfiguration(cfg =>
                    {
        Mapper.CreateMap<Report, ReportViewModel>()
            .ForMember(src => src.Value, 
                       dest => dest.ResolveUsing(r => {
                            switch(reportingPeriod)
                            {
                                case ReportingPeriod.Daily:
                                    return r.Day.Value;
                                    break;
                                case ReportingPeriod.Weekly:
                                    return r.Week.Value;
                                    break;
                                case ReportingPeriod.Monthly:
                                    return r.Month.Value;
                                    break;
                                case default:
                                    //None
                                    return null;
                                    break;
                               }
                            }));
            });
       var mapper = config.CreateMapper();

您需要返回该值。IMO 一个开关语句比嵌套更清晰,否则:

Mapper.CreateMap<Report, ReportViewModel>()
    .ForMember(src => src.Value, 
               dest => dest.MapFrom(r => 
                    switch(reportingPeriod)
                    {
                        case ReportingPeriod.Daily:
                            return r.Day.Value;
                            break;
                        case ReportingPeriod.Weekly:
                            return r.Week.Value;
                            break;
                        case ReportingPeriod.Monthly:
                            return r.Month.Value;
                            break;
                        case default:
                            //None
                            return null;
                            break;
                    }));