2013-02-21 8 views
15

Ich kann den folgenden Fehler nicht verstehen. Ich habe das Gefühl, dass es eine Einschränkung von LINQ und Ausdrucksbäumen ist, aber nicht sicher, wie man den Lambda-Körper akzeptiert. Kann ich dies OHNE einen benutzerdefinierten Konverter erstellen?AutoMapper und konvertieren Sie eine Datetime in String

Mapper.CreateMap<I_NEWS, NewsModel>()     
       .ForMember(x => x.DateCreated, opt => opt.MapFrom(src => { 
        var dt = (DateTime)src.DateCreated; 
        return dt.ToShortDateString();      
       })); 

Ich erhalte diese Fehlermeldung: Ein Lambda-Ausdruck mit einer Aussage Körper kann nicht auf einen Ausdruck Baum

Antwort

12

versuchen diese umgewandelt werden:

Mapper.CreateMap<I_NEWS, NewsModel>().ForMember(x => x.DateCreated, 
    opt => opt.MapFrom(src => ((DateTime)src.DateCreated).ToShortDateString())); 
+0

großen Dank, so Lambda Körper mit LINQ nicht funktionieren? – jaffa

+0

Hängt davon ab, da ein Ausdruck erforderlich ist, können Sie kein "bodied" Lambda liefern –

23

Um Lambda zu verwenden Körper, verwenden Sie .ResolveUsing anstelle von .MapFrom.

Gemäß den author:

MapFrom has some extra stuff that needs expression trees (like null checking etc).

So Ihre Aussage würde wie folgt aussehen:

Mapper.CreateMap<I_NEWS, NewsModel>()     
       .ForMember(x => x.DateCreated, opt => opt.ResolveUsing(src => { 
        var dt = (DateTime)src.DateCreated; 
        return dt.ToShortDateString();      
       })); 
+3

Beachten Sie, dass intellisense nicht erkennen wird, welche ResolveUsing-Überladung Sie verwenden möchten, bis Sie manuell auf eine Eigenschaft Ihres src-Objekts https: // github verweisen. com/AutoMapper/AutoMapper/issues/227 # issuecomment-61118211 – epalm