C# 基于条件自动映射两个对象
试图确定是否可以在C# 基于条件自动映射两个对象,c#,json,automapper,C#,Json,Automapper,试图确定是否可以在AutoMapper中映射客户和地址型号 进入CustomerDetails列表,其中Customer中的ID值与Address中的CustomerID匹配 public class Customer { public int ID { get; set; } public string FirstName { get; set; } public string Surname { get; set; } } public class Address
AutoMapper
中映射客户
和地址
型号
进入CustomerDetails
列表,其中Customer中的ID
值与Address中的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"
}
}
到目前为止,我只能想到以下自动映射配置
Mapper.CreateMap<Customer, CustomerDetails>();
Mapper.CreateMap<Address, CustomerDetails>()
Mapper.CreateMap();
Mapper.CreateMap()
用法
var-mapping=Mapper.Map(客户)
.地图(地址);
您可以根据客户id将这两个集合组合成一个元组类型(Customer,Address),并将该类型映射到CustomerDetail类型
CreateMap<(Customer cust, Address addr), CustomerDetails>();
customers.Select(r => (r, addresses.FirstOrDefault(a => a.CustomerID == r.ID))).Select(g => mapper.Map(g));
CreateMap();
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;
});
CreateMap()
.ForMember(d=>d.ID,opt=>opt.MapFrom(s=>s.ID))
.ForMember(d=>d.CustomerInfo,opt=>opt.MapFrom(s=>s))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.FormMember(d=>d.CustomerAddress,opt=>opt.MapFrom((s,d)=>d.ID==s.CustomerID?s:d.CustomerAddress))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.使用((a、d、ctx)=>
{
CustomerDetails match=d.FirstOrDefault(c=>c.ID==a.CustomerID);
如果(匹配!=null)
{
ctx.Mapper.Map(匹配,a);
}
返回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));
列出客户=新建列表();
列表地址=新列表();
var result=mapper.Map(客户);
addresses.ForEach(a=>mapper.Map(a,result));
您试图映射的数据源是什么?您是否有客户
集合和地址
集合?请查看AutoMapper.collection。@MattU是的,这将是客户
和地址
的集合。为什么投票失败?Automapper无法神奇地知道哪个地址属于哪个客户。您必须在映射之前分组,或者告诉映射配置如何知道。CreateMap()告诉映射配置如何将一个地址映射到现有的IEnumerable客户。CreateMap();希望您在映射之前对客户和地址进行分组。
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));