C# 按条件使用Automapper合并两个集合

C# 按条件使用Automapper合并两个集合,c#,automapper,C#,Automapper,有两种类型: 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]

有两种类型:

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
Collection

Collection
有数据更改,这些更改是在某处进行的。现在,我想使用Automapper将这些更改应用于
集合

为了简单起见,我们认为这些集合中的项目数相等,但项目的顺序可能不同

要正确映射集合项,我想使用
MergeId
属性。我需要这样的东西:

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

这可能与Automapper有关吗?

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

    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;
        }
    }
公共类转换器:ITypeConverter
{
公共集合转换(ResolutionContext上下文)
{
var destCollection=(Collection)context.DestinationValue;
var sourceCollection=(Collection)context.SourceValue;
foreach(sourceCollection中的变量源)
{
var dest=destCollection.SingleOrDefault(d=>d.MergeId==source.MergeId);
映射器映射(源、目标);
}
回收;
}
}

另一种解决方案可以简单地将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));
var res=来自订单中的详细信息
在a.MergeId等于b.MergeId的OrderDetailsTo中加入b
其中a.Update==true//在此处确定更新选择器
选择新的{a,b};
res.Each(item=>Mapper.Map(item.a,item.b));
为所有合并提取通用扩展方法(基于连接扩展方法)也很容易