代码之家  ›  专栏  ›  技术社区  ›  crichavin

在Automapper CreateMap和Projection中使用枚举作为条件

  •  1
  • crichavin  · 技术社区  · 7 年前

    使用AutoMapper v6.1

    无需硬编码该值来代替枚举( (int)POStatusOptions.Ordered ),如何使用投影完成此地图:

    CreateMap<WorkOrderDetail, WorkOrderDetailsListViewModel>(MemberList.Destination)
    .ForMember(vm => vm.QtyOnPOs, opt => opt.MapFrom(entity =>
        entity.Item.PODetails
            .Where(pod => pod.POHeader.StatusId >= (int)POStatusOptions.Ordered)
            .Sum(pod => pod.QtyOrdered)
            )))
    

    我对automapper的配置是使用配置文件。所以我有

    我的配置类:

    public static class AutoMapperConfiguration
    {
        public static void Configure()
        {
            //see https://github.com/AutoMapper/AutoMapper/wiki/Configuration
            //see https://github.com/AutoMapper/AutoMapper/wiki/Configuration-validation 
            Mapper.Initialize(am =>
            {
                am.AddProfile<AutoMapperViewModelProfile>();
                am.AddProfile<AutoMapperViewModelProfileAdmin>();
            });
    
            //uncomment this during testing to get a list of all errors in the browser when you run any page in otis
            Mapper.AssertConfigurationIsValid();
        }    
    }
    

    它被调用 Application_Start() 例如: AutoMapperConfiguration.Configure();

    我的个人资料类别:

    public class AutoMapperViewModelProfile : Profile
    {
        public AutoMapperViewModelProfile()
        {
            CreateMap<WorkOrderDetail, WorkOrderDetailsListViewModel>(MemberList.Destination)
            .ForMember(vm => vm.QtyOnPOs, opt => opt.MapFrom(entity =>
                entity.Item.PODetails
                .Where(pod => pod.POHeader.StatusId >= (int)POStatusOptions.Ordered)
                .Sum(pod => pod.QtyOrdered)
            )))
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   dbraillon    7 年前

    在AutoMapper中,它被称为 参数化 . 请参见 AutoMapper doc .

    在您的情况下,可能是:

    POStatusOption poStatusOption = POStatusOption.Whatever;
    CreateMap<WorkOrderDetail, WorkOrderDetailsListViewModel>(MemberList.Destination)
       .ForMember(
          vm => vm.QtyOnPOs, 
          opt => opt.MapFrom(entity =>
             entity.Item.PODetails
                .Where(pod => pod.POHeader.StatusId >= (int)poStatusOption)
                .Sum(pod => pod.QtyOrdered)
          )
       )
    

    您需要这样使用它:

    dbContext.WorkOrderDetails.ProjectTo<WorkOrderDetailsListViewModel>(Config, new { poStatusOption = POStatusOptions.Ordered });