2011-06-03 81 views
14

我有一个包含集合的域模型,我想使用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>(); 

,我不想订单是在有DeletedDate值视图模型。

AutoMapper中可能吗?非常感谢提前,

史蒂夫。

回答

23

我遇到类似的一个类似的问题,最后的办法来下面为我工作:

Mapper.CreateMap<Customer, CustomerViewModel>() 
    .ForMember(dest => dest.Orders, 
     opt => opt.MapFrom(src => src.Orders.Where(o => !o.DeletedDate.HasValue))); 

这里假设你的客户实体和CustomerViewModel DTO已收藏命名为“订单”。

+0

太好了,谢谢你的工作。 – 2011-06-27 14:29:58

1

这听起来像是很适合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方法,但我无法看到我正在使用的最新版本中的该功能。

+0

您是否将ValueResolver应用于客户或订单的地图? – 2011-06-03 12:24:16

+0

嗨,我也看到了来自作者Jimmy Bogard的这篇文章,并试图使用Skip扩展方法,但无法使用。自从2010年4月发布这篇文章后,它可能随后被删除? – 2011-06-06 10:25:44

+0

也许这个问题的答案是,Automapper真的只是一个映射工具,不应该用来做某种业务领域逻辑。例如,扁平结构是可以的,但是忽略从集合中转换某些成员是不行的。 因为MVC视图应该很愚蠢,所以我不愿意迭代Order集合并跳过空集合或带有DeletedDate集合的集合。同样,我不确定在CustomerViewModel上放置一个名为GetOrdersNotDeleted的新方法的纯度。 – 2011-06-06 10:31:38