我正在尝试映射嵌套的子属性,如此。
var mapperConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Collection, CollectionDTO>()
.ForMember(dest => dest.Items.Select(x => x.AddedToCollectionDate),
opts => opts.MapFrom(src =>
src.CollectionItems.Select(ci => ci.AddedToCollectionDate)));
});
Collection.Items
是List<Item>
。每个Item
都有一个AddedToCollectionDate
属性,我需要从源映射填充。
CollectionDTO
具有一个名为CollectionItem
的交叉连接表的导航属性,该表具有名为AddedToCollectionDate
的属性。
错误:
仅对某个类型的顶级个人成员支持成员的自定义配置。
如何使用AutoMapper实现这一目标?
Clases(为简洁省略了其他属性):
public partial class Collection
{
public virtual ICollection<CollectionItem> CollectionItems { get; set; }
}
public partial class CollectionItem
{
public System.DateTime AddedToCollectionDate { get; set; }
public virtual Collection Collection { get; set; }
public virtual Item Item { get; set; }
}
public class CollectionDTO
{
public List<ItemDTO> Items { get; set; }
public DateTime LastAccessedDate { get; set; }
}
public class Item
{
public DateTime LastAccessedDate { get; set; }
public virtual ICollection<CollectionItem> CollectionItems { get; set; }
}
答案 0 :(得分:1)
我通过FirstOrDefault()
代替Select()
这样的选择来实现它。
cfg.CreateMap<Item, ItemDTO>()
.ForMember(dest => dest.AddedToCollectionDate,
opts => opts.MapFrom(src =>
src.CollectionItems.FirstOrDefault().AddedToCollectionDate));
答案 1 :(得分:0)
您应该为ForMember
配置映射,而不是CollectionItem
调用。
cfg.CreateMap<CollectionItem, ItemDTO>();
cfg.CreateMap<Collection, CollectionDTO>();
如果您还将CollectionDTO.Items
重命名为CollectionDTO.CollectionItems
,AutoMapper知道足以将Collection.CollectionItems
映射到CollectionDTO
中的正确集合。