2

有两种类型:

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有关吗?

4

2 回答 2

2

我没有找到比使用如下自定义转换器更好的解决方案。

    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;
        }
    }
于 2012-09-26T06:25:54.327 回答
2

另一种解决方案可以简单地将 linq 查询 + 自动映射器结合起来。

基本概念在这里显示:

   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));

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

于 2012-09-26T07:25:45.950 回答