Automapper карта свойств к списку - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в AutoMapper и у меня проблемы с отображением.

Мой исходный объект:

public class SourceEntity
{
    public IEnumerable<object> List1 {get; set; }
    public IEnumerable<object> List2 {get; set; }
}

public class DestEntity
{
    public List<SubDestinationEntity> DestinationObjects { get; set; }
}

public class SubDestinationEntity
{
    public string Title {get; set;}
    public IEnumerable<object> Objects {get; set;}
}

Я не могу понять, как карта может перечислить SourceEntity в List. Я имею в виду, DestinationObjects должен содержать SubDestinationEntity, который содержит списки источников в Objects collection

UPD

Вручную это выглядит так:

var destItem=new DestEntity();
if(sourceItem.List1.Any())
{
    destItem.DestinationObjects.Add(new SubDestinationEntity
      {
         Title="Some text 1",
         Objects=sourceItem.List1 
      }
}
if(sourceItem.List2.Any())
{
    destItem.DestinationObjects.Add(new SubDestinationEntity
      {
         Title="Some text 2",
         Objects=sourceItem.List2
      }
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Поскольку между именами SourceEntity и DestEntity нет соглашения об именовании и сопоставления свойств отношения один к одному, у вас есть два параметра:

Использование сопоставления конструктора

Для этоговам нужно добавить конструктор к вашему DestEntity, как показано ниже:

public DestEntity(IEnumerable<object> list1, IEnumerable<object> list2)
{
    this.DestinationObjects = new List<SubDestinationEntity>();
    if (list1.Any())
    {
        this.DestinationObjects.Add(new SubDestinationEntity
        {
            Title = "Some text 1",
            Objects = list1
        });
    }
    if (list2.Any())
    {
        this.DestinationObjects.Add(new SubDestinationEntity
        {
            Title = "Some text 2",
            Objects = list2
        });
    }
}

После этого создайте свое отображение следующим образом:

cfg.CreateMap<SourceEntity, DestEntity>(MemberList.None)
   .ForCtorParam("list1", opt => opt.MapFrom(src => src.List1))
   .ForCtorParam("list2", opt => opt.MapFrom(src => src.List2));

Примечание: Выможете избежать использования .ForCtorParam(), если параметры вашего конструктора соответствуют именам свойств вашего типа источника.Они нужны только тогда, когда параметры не совпадают.

Использование метода ConstructUsing

Если вы не хотите изменять класс DestEntity, добавив новый конструктор, вы можете использовать метод ConstructUsingкак показано ниже:

cfg.CreateMap<SourceEntity, DestEntity>(MemberList.None)
   .ConstructUsing(sourceItem =>
   {
       var destItem = new DestEntity
       {
           DestinationObjects = new List<SubDestinationEntity>()
       };
       if (sourceItem.List1.Any())
       {
           destItem.DestinationObjects.Add(new SubDestinationEntity
           {
               Title = "Some text 1",
               Objects = sourceItem.List1
           });
       }
       if (sourceItem.List2.Any())
       {
           destItem.DestinationObjects.Add(new SubDestinationEntity
           {
               Title = "Some text 2",
               Objects = sourceItem.List2
           });
       }

       return destItem;
   });

Я предпочитаю использовать первую версию, в которой используется отображение constrructor, потому что я не хочу вкладывать много логики в конфигурацию отображения.

0 голосов
/ 15 мая 2018

Вы имеете в виду что-то подобное?

CreateMap<SourceEntity, DestEntity>()
.AfterMap((src, dest) =>
{
    if (src != null)
    {
        dest = new DestEntity()
        {
            DestinationObjects = new List<SubDestinationEntity>()
        };
        dest.DestinationObjects.Add(new SubDestinationEntity()
        {
            Title = "Some text 1",
            Objects = src.List1
        });
        dest.DestinationObjects.Add(new SubDestinationEntity()
        {
            Title = "Some text 2",
            Objects = src.List2
        });
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...