[英]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.