使用Automapper覆盖现有映射

3

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

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));

将所有的值和枚举值复制到视图模型中,并让它具有一个显示属性,选择正确的值。 - Gert Arnold
2个回答

1

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

类似的问题在这里提出。请查看Mrchief的答案。

   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();

0

你需要返回值。在我看来,使用 switch 语句比嵌套的 if else 更清晰:

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;
                    }));

我同意使用switch语句。那绝对更好,但是当我这样做时,它没有覆盖在Mapper.Initialize()方法中创建的现有映射。 - ajpetersen
你现在使用的地图实现是什么? - rageit
你在哪里为NegativeReport和NegativeReportModel调用CreateMap方法? - rageit
抱歉造成困惑,应该是报告和报告视图模型。我已在问题中进行了编辑。 - ajpetersen
你是不是有意无意地定义了 Mapper.CreateMap<Report, ReportViewModel>() 两次? - rageit
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接