我们一直使用AutoMapper来映射DTO或使用实体(域)模型查看模型。但是有一些类型的视图模型是从实体构建的,没有1到1的匹配。
例如,在搜索页面上
var model = new FilterOptionsModel
{
Organizations = all.Select(t => t.Organization.Name).Distinct(),
Locations = all.Select(t => t.Location.Name).Distinct(),
Types = all.Select(t => t.Type).Distinct(),
MinDate = all.Select(t => t.Date).Min(),
MaxDate = all.Select(t => t.Date).Max(),
NumberGroups = new[] { "All", "1 ~ 10", ">10" }
};
我的问题是,是否可以使用AutoMapper创建这种视图模型?或者,我们要求它太多了吗?
更新
这是我迄今为止所得到的,感谢Andrew Whitaker的回答。
Mapper.CreateMap<Tournament, FilterOptionsModel>()
.ForMember(dest => dest.Organizations,
opts => opts.MapFrom(src => src.Organization.Name.Distinct()))
.ForMember(dest => dest.Locations,
opts => opts.MapFrom(src => src.Location.Name.Distinct()));
正如评论中所提到的,我发现lambda表达式中Select
上没有src
链接Linq方法。
但是对于MinDate
和MaxDate
,我仍然无法弄清楚如何使用MapFrom。有什么建议吗?
答案 0 :(得分:1)
当然可以:
Mapper.CreateMap<IEnumerable<MyObject>, FilterOptionsModel>()
.ForMember(
dest => dest.Organizations,
opt => opt.MapFrom(src => src.Select(t => t.OrganizationUnit.Name).Distinct())
.ForMember(
dest => dest.Locations,
opt => opt.MapFrom(src => src.Select(t => t.Location.Name).Distinct())
/* etc */
.ForMember(
dest => dest.NumberGroups,
opt => opt.UseValue(new[] { "All", "1 ~ 10", ">10" }));
用法:
var all = /* */;
Mapper.Map<FilterOptionsViewModel>(all);