根据条件自动映射两个对象

问题描述 投票:0回答:1

[试图确定在AutoMapper中是否可以映射CustomerAddress模型的进入CustomerDetails列表,其中客户中的ID值与地址中的CustomerID匹配?

public class Customer {
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

public class Address {
    public int ID { get; set;}
    public int CustomerID { get; set; }
    public string Address1 { get; set; }
    public string Address2  { get; set; }
    public string Town { get; set; }
    public string PostCode { get; set; }
}

public class CustomerDetails{
    public int ID { get; set; }
    public Customer CustomerInfo { get; set; }
    public Address CustomerAddress { get; set; }
}

最终目标是拥有以下Json对象

{
  ID: 1234,  
  CustomerInfo: {
      ID: 1,
      FirstName: "John",
      Surname: "Connor"   
  }
  CustomerAddress: {
      ID: 1232,
      CustomerID: 1,
      Address1: "123 Avenue",
      Address2: "Some road",
      Town: "London",
      PostCode: "L1WLL"
  }  
}

到目前为止,我只能想到以下AutoMapper配置

Mapper.CreateMap<Customer, CustomerDetails>();
Mapper.CreateMap<Address, CustomerDetails>()

用法

var mapping = Mapper.Map<CustomerDetails>(Customer)
                .Map(Address);
c# json automapper
1个回答
-1
投票

您可以根据客户ID将这两个集合组合成一个元组类型(客户,地址),并将该类型映射到CustomerDetail类型。

CreateMap<(Customer cust, Address addr), CustomerDetails>();
customers.Select(r => (r, addresses.FirstOrDefault(a => a.CustomerID == r.ID))).Select(g => mapper.Map(g));

您还可以分两个阶段进行映射,首先将客户映射到客户详细信息,然后将地址映射到客户详细信息:

        CreateMap<Customer, CustomerDetails>()
            .ForMember(d => d.ID, opt => opt.MapFrom(s => s.ID))
            .ForMember(d => d.CustomerInfo, opt => opt.MapFrom(s => s))
            .ForAllOtherMembers(opt => opt.Ignore());

        CreateMap<Address, CustomerDetails>()
            .ForMember(d => d.CustomerAddress, opt => opt.MapFrom((s, d) => d.ID == s.CustomerID ? s : d.CustomerAddress))
            .ForAllOtherMembers(opt => opt.Ignore());

        CreateMap<Address, IEnumerable<CustomerDetails>>()
            .ConvertUsing((a, d, ctx) =>
            {
                CustomerDetails match = d.FirstOrDefault(c => c.ID == a.CustomerID);
                if (match != null) 
                {
                    ctx.Mapper.Map(match, a);
                }

                return d;
            });

映射:

List<Customer> customers = new List<Customer>();
List<Address> addresses = new List<Address>();
var result = mapper.Map<List<CustomerDetails>>(customers);
addresses.ForEach(a => mapper.Map(a, result));
© www.soinside.com 2019 - 2024. All rights reserved.