AutoMapper将源对象上的单个列表映射到目标对象上的两个列表中

时间:2012-07-19 14:19:28

标签: c# mapping automapper dto domain-object

我正在尝试使用AutoMapper从包含对象列表的Domain对象进行映射,其中我有一个布尔属性,我想使用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。

希望你们中的一位可以帮助我开始做这种映射,我会发现它非常有用。

提前致谢。

2 个答案:

答案 0 :(得分:5)

你可以这样做

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 );
    }
}

答案 1 :(得分:2)

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是否允许多行lambda,但我实际上会尝试使用ConvertUsing,看看是否有效。