使用automapper将过滤器应用于集合

时间:2011-06-03 11:17:43

标签: collections filter automapper ignore skip

我有一个包含集合的域模型,我想使用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可以吗?非常感谢,

史蒂夫。

2 个答案:

答案 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方法,但我无法在我正在使用的最新版本中看到该功能。