我们可以使用AutoMapper构建搜索过滤器或其他专用视图模型吗?

时间:2014-12-30 20:35:09

标签: c# entity-framework automapper

我们一直使用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方法。

但是对于MinDateMaxDate,我仍然无法弄清楚如何使用MapFrom。有什么建议吗?

1 个答案:

答案 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);
相关问题