2012-07-19 123 views
2

我试图使用AutoMapper从一个Domain对象进行映射,该对象包含一个对象列表,其中我有一个布尔属性,我想使用AutoMapper使用该属性将该列表拆分为目标对象上的两个目标。AutoMapper将源对象上的单个列表映射到目标对象上的两个列表

我的基本域看起来是这样的(源)

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

所以我的来源将是一个的IList <条>

我的看法是这样的(目标)

//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只包含InactiveArticles的用 “IsActive =真” 的文章,以及反之亦然。

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

在此先感谢。

回答

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

这完美地工作。 – CodeMonkey 2012-07-19 15:14:18

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,看看它是否有效。

相关问题