使用自动映射器将过滤器应用于集合
我有一个包含集合的域模型,我想使用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中可能吗?非常感谢提前,
史蒂夫。
我遇到类似的一个类似的问题,最后的办法来下面为我工作:
Mapper.CreateMap<Customer, CustomerViewModel>()
.ForMember(dest => dest.Orders,
opt => opt.MapFrom(src => src.Orders.Where(o => !o.DeletedDate.HasValue)));
这里假设你的客户实体和CustomerViewModel DTO已收藏命名为“订单”。
这听起来像是很适合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
方法,但我无法看到我正在使用的最新版本中的该功能。
您是否将ValueResolver应用于客户或订单的地图? – 2011-06-03 12:24:16
嗨,我也看到了来自作者Jimmy Bogard的这篇文章,并试图使用Skip扩展方法,但无法使用。自从2010年4月发布这篇文章后,它可能随后被删除? – 2011-06-06 10:25:44
也许这个问题的答案是,Automapper真的只是一个映射工具,不应该用来做某种业务领域逻辑。例如,扁平结构是可以的,但是忽略从集合中转换某些成员是不行的。 因为MVC视图应该很愚蠢,所以我不愿意迭代Order集合并跳过空集合或带有DeletedDate集合的集合。同样,我不确定在CustomerViewModel上放置一个名为GetOrdersNotDeleted的新方法的纯度。 – 2011-06-06 10:31:38
太好了,谢谢你的工作。 – 2011-06-27 14:29:58