collections - net - Usando automapper para aplicar un filtro a una colección
automapper nuget (2)
Tengo un modelo de dominio que contiene una colección y quiero usar AutoMapper para asignar el padre y los hijos al modelo de vista, pero no quiero que se eliminen los niños que han sido "blandos". Por ejemplo:
public class Customer {
public EntitySet<Order> {get;set;}
}
public class Order {
public DateTime? DeletedDate {get;set;}
}
mi definición de AutoMapper sería
Mapper.CreateMap<Customer, CustomerViewModel>();
Mapper.CreateMap<Order, OrderViewModel>();
y no quiero que los pedidos estén en el modelo de vista que tienen un valor para DeletedDate.
¿Es eso posible en AutoMapper? Muchas gracias de antemano,
Steve
Esto parece que sería una buena opción para un ValueResolver personalizado . Le permitirá realizar sus comprobaciones lógicas de forma aislada. No tengo Visual Studio delante de mí en este momento, pero puedo agregar un código de ejemplo más adelante si lo desea.
EDITAR : Después de jugar con esto, no creo que un ValueResolver sea el camino a seguir. Pude hacerlo funcionar usando la siguiente configuración condicional para la asignación de Order
:
Mapper.CreateMap<Order, OrderViewModel>()
.ForAllMembers(opt => opt.Condition(src => !src.DeletedDate.HasValue));
Lo único con esto es que OrderViewModel
seguirá OrderViewModel
pero será null
. En otras palabras, si tuvo 3 pedidos y uno tuvo una fecha de eliminación, entonces el número 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 forma clara de hacerlo ahora.
Aquí hay una publicación con una respuesta del autor de AutoMapper que habla sobre un método Skip
, pero no pude ver esa característica en la última versión que estoy usando.
Me encontré con un problema similar y, finalmente, el enfoque similar al de abajo me funcionó:
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 tienen colecciones denominadas "Pedidos".