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

时间:2017-12-15 05:49:49

标签: c# enums automapper projection automapper-5

使用AutoMapper v6.1

无需硬编码该值代替枚举(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) ))) ),如何使用Projection完成此地图:

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

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

我的配置类:

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

1 个答案:

答案 0 :(得分:1)

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