3

我正在尝试使用 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。

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

提前致谢。

4

2 回答 2

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 );
    }
}
于 2012-07-19T14:44:55.233 回答
1
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,唯一的区别是您将从 a 开始, new ViewAllArticles因为您将负责创建它。我在这里没有这样做的唯一原因是因为我不记得 ConvertUsing 是否允许多行 lambda,但我实际上会尝试 ConvertUsing 并查看它是否有效。

于 2012-07-19T14:28:08.557 回答