简体   繁体   中英

AutoMapper - Map source list to a destination array

I am trying to map a source list to a destination array using AutoMapper.

Source classes

public class ReservationSource
{
    public Travel TravelSource { get; set; }

    public string SeqNo { get; set; }
}

public class Travel
{
    public string TravelId { get; set; }

    public ICollection<Trip> Trips { get; set; }
}

public class Trip
{
    public string  TrainNumber { get; set; }
    public string  Arrival { get; set; }
}

Destination classes

public class ReservationDestination 
{
    public Route[] TravelDest { get; set; }
    public string SeqNumber { get; set; }
}

public class Route
{
    public string SequNumber { get; set; }
    public string RouteId { get; set; }
}

private static route[] GetRoutes(ICollection<Trip> trips)
{
    List<route> routeList = new List<route>();

    foreach (var trip trips)
    {
        var route = new route
        {
            SequNumber = trip.trainNumber

        };
        routeList.Add(route);
    }
    return routeList.ToArray();
}

Map configuration

cfg.CreateMap<ReservationSource, ReservationDestination>()

var config = new MapperConfiguration(cfg =>
{
    cfg.AllowNullDestinationValues = true;
    cfg.CreateMap<ReservationSource, ReservationDestination>()
        .ForMember(dest => dest.SeqNumber, o => o.MapFrom(src => SeqNo))
        .ForPath(dest => dest.TravelDest, o => o.MapFrom(src => GetRoutes(src)));
});

This is what I have tried, here I would like to eliminate the GetRoutes method where I will do a manual map using a foreach loop. Is it possible to use any other way without a loop?

Add mapping for Trip and Route classes.

cfg.CreateMap<Trip, Route>()
    .ForMember(dest => dest.SequNumber, o => o.MapFrom(src => src.TrainNumber));

Complete Mapping Configuration

var config = new MapperConfiguration(cfg =>
{       
    cfg.CreateMap<Trip, Route>()
        .ForMember(dest => dest.SequNumber, o => o.MapFrom(src => src.TrainNumber));
            
    cfg.AllowNullDestinationValues = true;
    cfg.CreateMap<ReservationSource, ReservationDestination>()
        .ForMember(dest => dest.SeqNumber, o => o.MapFrom(src => src.SeqNo))
        .ForPath(dest => dest.TravelDest, o => o.MapFrom(src => src.TravelSource.Trips));
});

IMapper mapper = config.CreateMapper();
        
var source = new ReservationSource
{
    SeqNo = "Seq001",
    TravelSource = new Travel
    {
        TravelId = "1",
        Trips = new List<Trip>
        {
            new Trip { TrainNumber = "A0001" },
            new Trip { TrainNumber = "B0001" }
        }
    }
};
        
var destination = mapper.Map<ReservationSource, ReservationDestination>(source);
Console.WriteLine(JsonConvert.SerializeObject(destination));

Sample Program

Output

{"TravelDest":[{"SequNumber":"A0001","RouteId":null},{"SequNumber":"B0001","RouteId":null}],"SeqNumber":"Seq001"}

References

Lists and Arrays - AutoMapper documentation

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM