C# 按条件使用Automapper合并两个集合
有两种类型: 1) DTO类型: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]
[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));
为所有合并提取通用扩展方法(基于连接扩展方法)也很容易