Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于条件自动映射两个对象_C#_Json_Automapper - Fatal编程技术网

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));