2015-09-18 18 views
9

das Datum der Annahme ist NULL festlegbare Datetime:AutoMapper: komplex, wenn else-Anweisung in ForMember

Mapper.CreateMap<SomeViewModels, SomeDTO>()    
      .ForMember(dest => dest.Date, 
         opt => opt.MapFrom(src => 
         { 
          DateTime? finalDate = null; 
          if (src.HasDate == "N") 
          { 
           // so it should be null 
          } 
          else 
          {         
           endResult = DateTime.Parse(src.Date.ToString()); 

          }        
          return finalDate; 

         })); 

Der Fehler, den ich bekam, war: „Fehler 30 A Lambda-Ausdruck mit einer Aussage Körper kann nicht auf einen Ausdruck Baum umgewandelt werden“

Natürlich bin ich voll und ganz bewusst, dass ich die Abfrage vereinfachen kann wie:

Mapper.CreateMap<SomeViewModels, SomeDTO>() 
      .ForMember(dest => dest.Date, 
         opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString()))); 

Aber was, wenn ich darauf bestehen, die Struktur des ersten Beispiels zu behalten, weil ich noch komplizierter, wenn sonst Aussagen habe, dass die zweites Beispiel kann nicht oder zumindest nicht gut lesbar sein?

Antwort

16

Verwenden ResolveUsing Methode:

Mapper.CreateMap<SomeViewModels, SomeDTO>()    
     .ForMember(dest => dest.Date, o => o.ResolveUsing(Converter)); 

private static object Converter(SomeViewModels value) 
{ 
    DateTime? finalDate = null; 
    if (value.Date.HasDate == "N") 
    { 
     // so it should be null 
    } 
    else 
    {         
     finalDate = DateTime.Parse(value.Date.ToString()); 
    }        
    return finalDate; 
} 

hier weitere Informationen: AutoMapper: MapFrom vs. ResolveUsing

+0

Also muss ich die anderen Eigenschaften Mapping im Konverter, obwohl der Rest sind einfach Mapping definieren? –

+0

@Sum kurz - ja. aber Sie können es mit AutoMapper in Converter Ignorieren diese Eigenschaft zuordnen und es manuell einstellen :) welcher Typ ist Ihre Eigenschaft Date? – Backs

+0

Es ist ein Nullable DateTime, vergessen, das in meiner Frage zu erwähnen. Könnten Sie dieses Beispiel auch in Ihre Antwort einfügen (mit Autoadapter in Converter verknüpfen)? Vielen Dank. –