合并两个集合与Automapper的条件(Merge two collections with Au

2019-09-22 23:49发布

有两种类型:

1)DTO类型:

[DataContract]
public sealed class OrderDetailDto
{
    [DataMember]
    public Guid MergeId { get; set; }
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string PostionName { get; set; }
    [DataMember]
    public decimal Quantity { get; set; }
    [DataMember]
    public byte[] Version { get; set; }
}

2)对应的域类型:

public sealed class OrderDetail
{
    public Guid MergeId { get; set; }
    public int Id { get; set; }
    public string PostionName { get; set; }
    public decimal Quantity { get; set; }
    public byte[] Version { get; set; }
}

和两个集合: Collection<OrderDetail>Collection<OrderDetailDto>

Collection<OrderDetailDto>有数据的变化,这是什么地方做。 现在我想将这些更改Collection<OrderDetail>使用Automapper。

为简单起见,我们认为,该项目数在这些集合是相等的,但是项目的顺序可能会有所不同。

要正确映射收集物品,我想用MergeId财产。 我需要的是这样的:

Mapper.CreateMap<Collection<OrderDetailDto>, Collection<OrderDetail>>()
  .MappingExpression((dto, do) => dto.MergeId == do.MergeId);

这是可以做到与Automapper?

Answer 1:

我还没有发现比使用自定义转换器像下面更好的解决方案。

    public class Converter : ITypeConverter<Collection<OrderDetailDto>, Collection<OrderDetail>>
    {
        public Collection<OrderDetail> Convert(ResolutionContext context)
        {
            var destCollection = (Collection<OrderDetail>) context.DestinationValue;
            var sourceCollection = (Collection<OrderDetailDto>)context.SourceValue;
            foreach (var source in sourceCollection)
            {
                var dest = destCollection.SingleOrDefault(d => d.MergeId == source.MergeId);
                Mapper.Map(source, dest);
            }
            return destCollection;
        }
    }


Answer 2:

另一种解决方案可以简单地LINQ查询+ automapper结合。

基本概念是在这里展示:

   var res = from a in orderDetails
              join b in orderDetailsDto on a.MergeId equals b.MergeId
              where a.Update == true // determine update selector here
              select new { a, b };

    res.Each(item => Mapper.Map<OrderDetail, OrderDetailDto>(item.a, item.b));

这也很容易提取的所有合并的通用扩展方法(基于连接的扩展方法)



文章来源: Merge two collections with Automapper by condition
标签: c# AutoMapper