簡體   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