繁体   English   中英

Automapper:DTO 与 Array to List

[英]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; }
}

这是数据库实体。 StatusIdUsernameCommentDate对于所有这些都是相同的,并且 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM