2011-06-03 18 views
14

Tengo un modelo de dominio que contiene una colección y quiero usar AutoMapper para mapear los elementos principales y secundarios para el modelo de vista pero no quiero hijos que hayan sido "suaves" eliminado para ser tomado a través. Por ejemplo:Uso de Automapper para aplicar un filtro a una colección

public class Customer { 
    public EntitySet<Order> {get;set;} 
} 
public class Order { 
    public DateTime? DeletedDate {get;set;} 
} 

mi definición AutoMapper sería

Mapper.CreateMap<Customer, CustomerViewModel>(); 
Mapper.CreateMap<Order, OrderViewModel>(); 

y no quiere órdenes para estar en el modelo de vista que tienen un valor para DeletedDate.

¿Eso es posible en AutoMapper? Muchas gracias de antemano,

Steve.

Respuesta

23

me encontré con tema similar y, finalmente, el enfoque similar a la de abajo trabajó para mí:

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

Esto supone que su entidad cliente y CustomerViewModel dto han colecciones llamado "Pedidos".

+0

Genial, gracias por eso, funcionó una delicia. –

1

Parece que sería una buena opción para un custom ValueResolver. Te permitirá hacer tus verificaciones lógicas de forma aislada. No tengo Visual Studio frente a mí en este momento, pero puedo agregar un código de muestra más adelante si lo desea.

EDIT: Después de retocar con esto, no creo que un ValueResolver sea el camino a seguir. Yo era capaz de conseguir que funcione utilizando la siguiente configuración condicional para el mapeo Order:

Mapper.CreateMap<Order, OrderViewModel>() 
    .ForAllMembers(opt => opt.Condition(src => !src.DeletedDate.HasValue)); 

La única cosa con esto es que el OrderViewModel se todavía vienen más, pero habrá null. En otras palabras, si tenía 3 pedidos y uno tenía una fecha de eliminación, entonces la cantidad de pedidos que tendrá en su modelo de vista seguirá siendo 3, pero el valor eliminado será null. Supongo que sería mejor tener solo 2, pero no veo una manera clara de hacerlo en este momento.

Here's a post con una respuesta del autor de AutoMapper que habla de un método Skip, pero no pude ver esa característica en la última versión que estoy usando.

+0

¿Aplicaría ValueResolver al mapa para Cliente o para pedido? –

+0

Hola, también vi esa publicación del autor Jimmy Bogard e intenté usar el método de extensión Omitir pero no pude. Dado que esa publicación fue fechada en abril de 2010, ¿fue eliminada posteriormente? –

+0

Quizás la respuesta a esta pregunta es que Automapper realmente es solo una herramienta de mapeo y no debe usarse para hacer algún tipo de lógica de dominio comercial. Por ejemplo, aplanar una estructura está bien, pero ignorar la transformación de ciertos miembros de una colección no está bien. Como se supone que las vistas MVC son bastante tontas, soy reacio a recorrer la colección Order y omitir las nulas o las que tienen un conjunto DeletedDate. Del mismo modo, no estoy seguro de la pureza de poner un nuevo método en CustomerViewModel llamado GetOrdersNotDeleted. –

Cuestiones relacionadas