我正在尝试使用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。
希望你们中的一位可以帮助我开始做这种映射,我会发现它非常有用。
提前致谢。
答案 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,看看是否有效。