2017-12-15 4 views
1

Mit AutoMapper v6.1Mit Aufzählungen als Kriterien in AutoMapper CreateMap und Projektion

Ohne harten Code aufweisen, der anstelle der ENUM-Wert ((int)POStatusOptions.Ordered), wie können Sie erreichen diese Karte mit Projektion:

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

Meine Konfiguration für AutoMapper verwendet Profile. So habe ich

Meine Config Klasse:

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

die in Application_Start() wie genannt wird: AutoMapperConfiguration.Configure();

Mein Profil Klasse:

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

Antwort

1

In AutoMapper es Parametrierung genannt wird. Bitte sehen Sie AutoMapper doc.

In Ihrem Fall wäre es:

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

Und Sie müssen es wie folgt verwenden:

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

Danke, aber ich kann das nicht funktionieren bekommen. (Siehe meine aktualisierte Frage für weitere Details zu meinem Setup/Config). Wenn ich versuche, was Sie vorschlagen, bekomme ich den Fehler "Verwendung von nicht zugewiesenen lokalen Variablen" für die 'poStatusOptions' Variable. Was ich verstehen kann, wenn Sie die Variable in dieser Klasse deklarieren, aber nicht explizit einen Wert in dieser Klasse zuweisen ... Wie würde der Compiler wissen, dass Sie diese Werte von einer anderen Klasse weitergeben? –

+1

Ordnen Sie es einfach jedem Wert zu, ich glaube nicht, dass es eine Rolle spielt, AutoMapper wird es ersetzen – dbraillon

Verwandte Themen