我有一个包含集合的域模型,我想使用AutoMapper将父节点和子节点映射到视图模型,但我不希望将“软”删除的子节点移植到其中。例如:
public class Customer {
public EntitySet<Order> {get;set;}
}
public class Order {
public DateTime? DeletedDate {get;set;}
}
我的AutoMapper定义是
Mapper.CreateMap<Customer, CustomerViewModel>();
Mapper.CreateMap<Order, OrderViewModel>();
我不希望Orders在视图模型中具有DeletedDate的值。
AutoMapper可以吗?非常感谢,
史蒂夫。
答案 0 :(得分:27)
我遇到了类似的问题,最后类似于下面的方法对我有用:
Mapper.CreateMap<Customer, CustomerViewModel>()
.ForMember(dest => dest.Orders,
opt => opt.MapFrom(src => src.Orders.Where(o => !o.DeletedDate.HasValue)));
这假设您的Customer实体和CustomerViewModel具有名为“Orders”的集合。
答案 1 :(得分:2)
这听起来很适合custom ValueResolver。它将允许您以孤立的方式进行逻辑检查。我现在面前没有Visual Studio,但如果您愿意,我可以稍后添加一些示例代码。
修改强>:
在修补这个之后我不认为ValueResolver是要走的路。通过对Order
映射使用以下条件配置,我能够使它工作:
Mapper.CreateMap<Order, OrderViewModel>()
.ForAllMembers(opt => opt.Condition(src => !src.DeletedDate.HasValue));
唯一的问题是,OrderViewModel
仍然会过来,但它会是null
。换句话说,如果您有3个订单,并且其中一个订单有删除日期,那么您在视图模型中的订单数量仍为3,但删除的值将为null
。我猜最好只有2,但我现在没有看到明确的方法。
Here's a post得到了AutoMapper的作者的回复,该回复谈到了Skip
方法,但我无法在我正在使用的最新版本中看到该功能。