[英]Automapper: DTO with Array to List
我知道 Automapper 的基础知识,但我想知道它是否也可以做更复杂的事情,或者我是否被迫手动做类似的事情。 让我用我目前的情况来解释一下。
订单状态DTO
public class OrderStatusDTO
{
[Required]
public int[] OrderIds { get; set; }
[Required]
public int StatusId { get; set; }
[MaxLength(50)]
public string Username { get; set; }
public string Comment { get; set; }
[Required]
public DateTime Date { get; set; }
}
这个 DTO 的目的相当简单。 它同时为多个订单创建一个订单状态。
订单状态
public class OrderStatus
{
[Required]
public int Id { get; set; }
[Required]
public int OrderId { get; set; }
[Required]
public int StatusId { get; set; }
[MaxLength(50)]
public string Username { get; set; }
public string Comment { get; set; }
[Required]
public DateTime Date { get; set; }
}
这是数据库实体。 StatusId
、 Username
、 Comment
和Date
对于所有这些都是相同的,并且 OrderStatus 对象的数量应该与OrderStatusDTO.OrderIds
数组的大小一样多。 每个对象的OrderId
属性将与OrderStatusDTO.OrderIds
数组的值之一匹配。
是否可以为此使用 Automapper,以便我可以将这样的结果作为最终结果:
_mapper.Map<OrderStatusDTO, List<OrderStatus>>(orderStatusDTO);
编辑:
在一个循环中,它将如下所示。
List<OrderStatus> orderStatus = new List<OrderStatus>();
for (int i = 0; i < orderStatusDTO.OrderIds.Length; i++) {
OrderStatus orderStatus = new OrderStatus();
orderStatus.OrderId = orderStatusDTO.OrderIds[i];
orderStatus.StatusId = orderStatusDTO.StatusId;
orderStatus.Username = orderStatusDTO.Username;
orderStatus.Comment = orderStatusDTO.Comment;
orderStatus.Date = orderStatusDTO.Date;
orderStatus.Add(orderStatus);
}
对 collections 使用 ProjectTo 方法。
List<OrderStatus> orderStatus = orderStatusDTO
.AsQueryable()
.ProjectTo<OrderStatus>()
.ToList();
资料来源:automapper.org
您必须提供这样的automapper
器配置 -
cfg.CreateMap<OrderStatusDTO, List<OrderStatus>>()
.ConvertUsing<OrderStatusDTOConverter>();
其中, OrderStatusDTOConverter
定义为 -
public class OrderStatusDTOConverter : ITypeConverter<OrderStatusDTO, List<OrderStatus>>
{
public List<OrderStatus> Convert(OrderStatusDTO source, List<OrderStatus> destination, ResolutionContext context)
{
var list = new List<OrderStatus>();
foreach (var orderId in source.OrderIds)
{
list.Add(new OrderStatus
{
Comment = source.Comment,
Date = source.Date,
OrderId = orderId,
StatusId = source.StatusId,
Username = source.Username
});
}
return list;
}
}
现在Map
为 -
var orderList = mapper.Map<List<OrderStatus>>(orderDTO);
如果你也想反转,添加配置为 -
cfg.CreateMap<List<OrderStatus>, OrderStatusDTO>()
.ForMember(p => p.OrderIds, opts => opts.MapFrom(s => s.Select(r => r.OrderId).ToArray()))
.ForMember(p => p.StatusId, opts => opts.MapFrom(s => s.Any() ? s.FirstOrDefault().StatusId : 0))
.ForMember(p => p.Username, opts => opts.MapFrom(s => s.Any() ? s.FirstOrDefault().Username : string.Empty))
.ForMember(p => p.Date, opts => opts.MapFrom(s => s.Any() ? s.FirstOrDefault().Date : new DateTime()))
.ForMember(p => p.Comment, opts => opts.MapFrom(s => s.Any() ? s.FirstOrDefault().Username : string.Empty));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.