使用 Automapper 覆盖现有映射
Overwrite Existing Mapping with Automapper
我有以下实体和视图模型:
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>();
}
然后 select 使用 .Project.To<>
var models = Context.Project().To<ReportViewModel>().ToList();
我的问题是我将枚举传递给这个查询,它告诉我值是月、周还是日。
public enum ReportingPeriod
{
None = 0,
Monthly = 1,
Weekly = 2,
Daily = 4
}
如何根据传递的枚举将值 属性 的映射设置为动态?
我尝试使用以下命令覆盖执行查询之前的配置,但这没有用。
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));
您需要 return 该值。 IMO 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;
}));
使用 Automapper 版本 5.2.0,您的语法应如下所示。您应该使用 ResolveUsing 而不是 MapFrom 并且 swith-case 应该在大括号内。您不必使用任何 Mapper.Initialize()。我测试了这段代码,它对我有用。我希望它也对你有帮助。干杯。
问过类似的问题 here。看 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();
我有以下实体和视图模型:
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>();
}
然后 select 使用 .Project.To<>
var models = Context.Project().To<ReportViewModel>().ToList();
我的问题是我将枚举传递给这个查询,它告诉我值是月、周还是日。
public enum ReportingPeriod
{
None = 0,
Monthly = 1,
Weekly = 2,
Daily = 4
}
如何根据传递的枚举将值 属性 的映射设置为动态?
我尝试使用以下命令覆盖执行查询之前的配置,但这没有用。
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));
您需要 return 该值。 IMO 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;
}));
使用 Automapper 版本 5.2.0,您的语法应如下所示。您应该使用 ResolveUsing 而不是 MapFrom 并且 swith-case 应该在大括号内。您不必使用任何 Mapper.Initialize()。我测试了这段代码,它对我有用。我希望它也对你有帮助。干杯。
问过类似的问题 here。看 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();