AutoMapper Сопоставляет один список исходного объекта с двумя списками целевого объекта

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

Мой основной домен выглядит так (источник)

//Domain object
public class Article
{
  public bool IsActive { get; set; }
}

так что моим источником будет IList ‹Article›

Моя точка зрения выглядит так (пункт назначения)

//DTO
public class ViewAllArticles
{
  public IList<ViewArticle> ActiveArticles { get; set; }
  public ILIst<ViewArticle> InactiveArticles { get; set; }
}

public class ViewArticle
{
  public bool IsActive { get; set; }
}

Требуется сопоставление

//wanted mapping code (source to destination)
Mapper.Map<IList<Article>, ViewAllArticles>(collectionOfAllArticles)

где ActiveArticles содержат только статьи с IsActive = true, и наоборот для InactiveArticles.

Надеюсь, кто-то из вас поможет мне приступить к построению такого рода карт, которые я считаю очень полезными.

Заранее спасибо.


person Community    schedule 19.07.2012    source источник


Ответы (2)


Вы можете сделать это так

internal class StartNewDemo
{
    public static void Main(string[] args)
    {
        Mapper.CreateMap<IList<Article>, ViewAllArticles>()
            .ForMember(map => map.ActiveArticles, opt => opt.MapFrom(x => x.Where(y => y.IsActive)))
            .ForMember(map => map.InactiveArticles, opt => opt.MapFrom(x => x.Where(y => !y.IsActive)));

        var list = new List<Article>() { new Article { IsActive=true }, new Article { IsActive = false } };
        var result = Mapper.Map<List<Article>, ViewAllArticles>( list );
    }
}
person Andriy Zakharko    schedule 19.07.2012

Mapper.CreateMap<IList<Article>, ViewAllArticles>()
  .AfterMap( (arts , artsvm) => 
{
   //var artsvm = new ViewAllArticles();
   artsvm.ActiveArticles = arts.Where(a=> IsActive==true).ToList();
   artsvm.InactiveArticles = arts.Where(a=> IsActive==false).ToList();
}

Вы также можете использовать ConvertUsing, с той лишь разницей, что вы начнете с new ViewAllArticles, потому что вы будете нести ответственность за его создание. Единственная причина, по которой я не сделал этого здесь, состоит в том, что я не мог вспомнить, позволяет ли ConvertUsing использовать многострочную лямбду, но я бы фактически попробовал ConvertUsing вместо этого и посмотрел, работает ли это.

person AaronLS    schedule 19.07.2012