Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automapper: complex if else statement in ForMember

Assuming the Date is a nullable DateTime:

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

The error I got was:

Error 30 A lambda expression with a statement body cannot be converted to an expression tree.

Of course I'm fully aware that I can simplify the query such as:

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

But what if I insist to retain the structure of the first example, because I have more complicated if else statements, that the second example will not able to cater for, or at least will not be very readable?

like image 405
Sum NL Avatar asked Sep 18 '15 02:09

Sum NL


People also ask

When should you not use AutoMapper?

If you have to do complex mapping behavior, it might be better to avoid using AutoMapper for that scenario. Reverse mapping can get very complicated very quickly, and unless it's very simple, you can have business logic showing up in mapping configuration.

How does AutoMapper work in C#?

AutoMapper in C# is a library used to map data from one object to another. It acts as a mapper between two objects and transforms one object type into another. It converts the input object of one type to the output object of another type until the latter type follows or maintains the conventions of AutoMapper.

How do I ignore property in AutoMapper?

So, the AutoMapper Ignore() method is used when you want to completely ignore the property in the mapping. The ignored property could be in either the source or the destination object.


1 Answers

In recent versions of AutoMapper, ResolveUsing was removed. Instead, use a new overload of MapFrom:

void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction); 

Just adding another lambda/function parameter will dispatch to this new overload:

        CreateMap<TSource, TDest>()                 .ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>                 {                     TSomeDestProp destinationValue;                      // mapping logic goes here                      return destinationValue;                 })); 
like image 193
Ronnie Overby Avatar answered Oct 10 '22 10:10

Ronnie Overby