2016-06-16 130 views
1

我试图通过使用EF的导航属性来映射两个集合。具有EF导航属性的自动映射器

Collection.ItemsList<Item>

CollectionDTO具有导航属性到交叉连接表称为CollectionItem,其具有另一个导航属性Item

我希望每个CollectionDTO.CollectionItem.Item都映射到Collection.Item

我试过这个,但我无法弄清楚。

有人可以帮忙吗?

var mapperConfig = new MapperConfiguration(cfg => 
{ 
    // CreateMap<source, destination>()  
    cfg.CreateMap<Collection, CollectionDTO>() 
     .ForMember(dest => dest.Items, 
        opts => opts.MapFrom(src => 
         src.CollectionItems.Where(x => x.CollectionId == src.Id).ToList().ForEach(ci => ci.Item))); 

}); 

回答

0

您可以使用Select扩展方法是这样的:

// CreateMap<source, destination>()  
    cfg.CreateMap<Collection, CollectionDTO>() 
     .ForMember(dest => dest.Items, 
        opts => opts.MapFrom(src => 
         src.CollectionItems.Select(ci=>ci.Item).ToList())); 

如果Item导航属性是一个集合,然后使用SelectMany扩展方法:

// CreateMap<source, destination>()  
    cfg.CreateMap<Collection, CollectionDTO>() 
     .ForMember(dest => dest.Items, 
        opts => opts.MapFrom(src => 
         src.CollectionItems.SelectMany(ci=>ci.Item).ToList())); 
+0

第二个选项是给我编错误,但第一个选项就像一个魅力!谢谢! – duyn9uyen

+0

不客气;)。这就是我猜到的,'CollectionItems'代表一个联结表,'Item'是一个参考导航属性。 – octavioccl