Soy nuevo en el mapeo automático y me pregunto cómo podría mapear un modelo plano en un Dto con propiedad de 1 cadena e IEnumerable
tengo estas clases
Y quiero mapear este Modelo
public class DirectionModel { public string DirectionId { get; set; } public decimal Longitude { get; set; } public decimal Latitude { get; set; } }A estas clases de DTO
public class DirectionDto { public string DirectionId { get; set; } public IEnumerable<CoordinateDto> Coordinates { get; set; } } public class CoordinateDto { public decimal Longitude { get; set; } public decimal Latitude { get; set; } }Entrada de muestra:
IEnum<DirectionModel>() { new DirectionModel() {DirectionId="id1", Longitude=1, Latitude=2}, new DirectionModel() {DirectionId="id1", Longitude=3, Latitude=4}, new DirectionModel() {DirectionId="id2", Longitude=5, Latitude=6} }Esta es la salida esperada:
IEnum<DirectionDto>() { new DirectionDto() {DirectionId="id1", IEnum<CoordinateDto>(){new CoordinateDto(){Longitude=1, Latitude=2}, new CoordinateDto(){Longitude=3, Latitude=4}}}, new DirectionDto() {DirectionId="id2", IEnum<CoordinateDto>(){new CoordinateDto(){Longitude=5, Latitude=6}}}, }(editar: se corrigió la entrada de muestra que puede haber causado confusión)
Puede usar AfterMap en AutoMapper , prefiero usar List en lugar de IEnumerable así:
autoMapperConfig.CreateMap<List<DirectionModel>, List<DirectionDto>>() .AfterMap((model, dto) => { if (dto == null) dto = new List<DirectionDto>(); if (model.Any()) { dto.AddRange(model.GroupBy(x => x.DirectionId) .Select(x => new DirectionDto() { DirectionId = x.Key, Coordinates = x.ToList() .Select(c => new CoordinateDto() { Latitude = c.Latitude, Longitude = c.Longitude }).ToList() }).ToList()); } });Y úsalo:
var lists = new List<DirectionModel>() { new DirectionModel() {DirectionId = "id1", Longitude = 1, Latitude = 2}, new DirectionModel() {DirectionId = "id1", Longitude = 3, Latitude = 4}, new DirectionModel() {DirectionId = "id2", Longitude = 5, Latitude = 6} }; var dtos = _mapper.Map<List<DirectionModel>, List<DirectionDto>>(lists);