How to map two list properties using Automapper

Class RegisterNewPessoaCommand

public class RegisterNewPessoaCommand {

 public RegisterNewPessoaCommand(PessoaNatureza pessoaNatureza, 
                                 PessoaFisica pessoaFisica, 
                                 PessoaJuridica pessoaJuridica, 
                                 PessoaGenerico pessoaGenerico, List<PessoaContato> pessoasContatos) {
  PessoaNatureza = pessoaNatureza;
  PessoaFisica = pessoaFisica;
  PessoaJuridica = pessoaJuridica;
  PessoaGenerico = pessoaGenerico;
  PessoasContatos = pessoasContatos;

 }

}

Person Classviewmodel

 public class PessoaViewModel {
 public List <PessoaDocumentoViewModel> PessoasDocumentosViewModel {
  get;
  set;
 }
}

Class Personcontact

public class PessoaContato : Entity
{
    public int ContatoTipoId { get; private set; }
    public int PessoaId { get; private set; }
    public string Contato { get; private set; }
    public string Detalhes { get; private set; }
    public bool ContatoPrincipal { get; private set; }

    public virtual Pessoa Pessoa { get; private set; }
    public virtual ContatoTipo ContatoTipo{ get; private set; }

    protected PessoaContato() { }

    public PessoaContato(int contatoTipoId, int pessoaId, string contato, string detalhes, bool contatoPrincipal)
    {
        ContatoTipoId = contatoTipoId;
        PessoaId = pessoaId;
        Contato = contato;
        Detalhes = detalhes;
        ContatoPrincipal = contatoPrincipal;

    }
}

Class Personcontactviewmodel

public class PessoaContatoViewModel
{
    [Key]
    public int Id { get; set; }

    public int PessoaId { get; set; }

    [DisplayName("Tipo de Contato")]
    [Required(ErrorMessage = "Escolha um Tipo de Contato")]
    public int ContatoTipoId { get; set; }
    [DisplayName("Tipo de Contato")]
    public string ContatoTipoDescricao { get; set; }
    [DisplayName("Tipos de Contato")]
    public IEnumerable<SelectListItem> ContatosTipos { get; set; }

    [DisplayName("Contato")]
    [Required(ErrorMessage = "O campo Contato é obrigatório")]
    [MaxLength(100, ErrorMessage = "O campo {0} deve ter no máximo {1} caracteres")]
    public string Contato { get; set; }

    [DisplayName("Detalhes")]
    [MaxLength(150, ErrorMessage = "O campo {0} deve ter no máximo {1} caracteres")]
    public string Detalhes { get; set; }

    [DisplayName("Contato Principal")]
    public bool ContatoPrincipal { get; set; }
}

I have the classes PessoaViewModel and RegisterNewPessoaCommand where I need to map the property PessoasDocumentosViewModel to List<PessoaContato> pessoasContatos, one is list of PessoaViewModel and the other is list of PessoaContato and both have the same fields.

The other properties are mapped and working. I need to Loop and load the fields from a List for another as the picture. Does anyone know how to help me?

insert the description of the image here

CreateMap<PessoaViewModel, RegisterNewPessoaCommand>()
.ConstructUsing(p => new RegisterNewPessoaCommand(
    p.PessoaNatureza,
   (p.PessoaFisicaViewModel != null ? new Domain.Models.PessoaFisica(
       p.PessoaFisicaViewModel.NomeCompleto,
       p.PessoaFisicaViewModel.Apelido,
       p.PessoaFisicaViewModel.DataNascimento,
       p.PessoaFisicaViewModel.Sexo,
       p.PessoaFisicaViewModel.EstadoCivil,
       p.PessoaFisicaViewModel.PessoaFisicaOrigem) : null
    ),
   (p.PessoaJuridicaViewModel != null ? new Domain.Models.PessoaJuridica(
       p.PessoaJuridicaViewModel.RazaoSocial,
       p.PessoaJuridicaViewModel.NomeFantasia,
       p.PessoaJuridicaViewModel.DataAbertura,
       p.PessoaJuridicaViewModel.RegimeTributario,
       p.PessoaJuridicaViewModel.PessoaJuridicaOrigem) : null

    ),
    (p.PessoaGenericoViewModel != null ? new Domain.Models.PessoaGenerico(
       p.PessoaGenericoViewModel.PessoaTipo,
       p.PessoaGenericoViewModel.CodigoInterno,
       p.PessoaGenericoViewModel.PessoaFilialId) : null
    ), 

    new List<PessoaContato>()   <========recebe as list de p.PessoasContatosViewModel  



));
Author: Master JR, 2018-09-11

1 answers

Using AutoMapper:

Mapper.Initialize(cfg => cfg.CreateMap<PessoaContatoViewModel, PessoaContato>());
List<PessoaContato> contato = Mapper.Map<List<PessoaContatoViewModel>, List<PessoaContato>>(pessoaContatoViewModels);

Instead of mapping vc can use ConvertAll,

 List<PessoaContato> contato = pessoaContatoViewModels.ConvertAll
            ( x => new PessoaContato (
             x.ContatoTipoId, 
             x.PessoaId, 
             x.Contato, 
             x.Detalhes,
             x.ContatoPrincipal 
             ) { });

I made a small demonstration using your(edited) modules:

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
         List<PessoaContatoViewModel> pessoaContatoViewModels = new List<PessoaContatoViewModel> {
                new PessoaContatoViewModel() {
                    Contato = "contato a",
                    ContatoTipoId = 1,
                    ContatoPrincipal = true
                },
                 new PessoaContatoViewModel() {
                    Contato = "contato b",
                    ContatoTipoId = 2,
                    ContatoPrincipal = true
                }
            };
            List<PessoaContato> contato = pessoaContatoViewModels.ConvertAll
            ( x => new PessoaContato (
             x.ContatoTipoId, 
             x.PessoaId, 
             x.Contato, 
             x.Detalhes,
             x.ContatoPrincipal 
             ) { });
            foreach (var item in contato)
            {
                Console.WriteLine(item.Contato);
            }

    }
    public class PessoaContatoViewModel
        {
            public int Id { get; set; }
            public int PessoaId { get; set; }
            public int ContatoTipoId { get; set; }
            public string ContatoTipoDescricao { get; set; }
            public string Contato { get; set; }
            public string Detalhes { get; set; }
            public bool ContatoPrincipal { get; set; }
        }

        public class PessoaContato
        {
            public int ContatoTipoId { get; private set; }
            public int PessoaId { get; private set; }
            public string Contato { get; private set; }
            public string Detalhes { get; private set; }
            public bool ContatoPrincipal { get; private set; }

            protected PessoaContato() { }
            public PessoaContato(int contatoTipoId, int pessoaId, string contato, string detalhes, bool contatoPrincipal)
            {
                ContatoTipoId = contatoTipoId;
                PessoaId = pessoaId;
                Contato = contato;
                Detalhes = detalhes;
                ContatoPrincipal = contatoPrincipal;

            }

        }
}
 1
Author: HudsonPH, 2019-03-01 06:33:50