2

次の 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; }
}

および 2 つのコレクション: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

さらに別の解決策として、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));

すべてのマージに対して一般的な拡張メソッド (join 拡張メソッドに基づく) を抽出することも簡単です。

于 2012-09-26T07:25:45.950 に答える
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 に答える