C# 自动映射多对一映射配置

C# 自动映射多对一映射配置,c#,mapping,automapper,automapper-3,C#,Mapping,Automapper,Automapper 3,我想将3个不同的类映射到一个DTO中,每个属性在源和目标上具有相同的名称,这些类如下所示: 使用者 候选人 投资组合 这是DTO以及我希望映射对象的方式: public class CandidateTextInfo { public string ProfilePicture { get; set; } //-->User public ObjectId UserId { get; set; } //-->User

我想将3个不同的类映射到一个DTO中,每个属性在源和目标上具有相同的名称,这些类如下所示:

  • 使用者
  • 候选人
  • 投资组合
这是DTO以及我希望映射对象的方式:

public class CandidateTextInfo
    {
        public string ProfilePicture { get; set; }   //-->User
        public ObjectId UserId { get; set; }         //-->User
        public string Name { get; set; }             //--> Candidate
        public string Headline { get; set; }         //--> Candidate
        public Gender Gender { get; set; }           //--> Candidate
        public byte Rating { get; set; }             //--> Candidate
        public bool IsCompany { get; set; }          //--> Candidate
        public string[] Tags { get; set; }           //--> Portafolio
        public string[] Categories { get; set; }     //--> Portafolio
        public string ExecutiveSummary { get; set; } //--> Portafolio
        public HourlyRate HourlyRate{ get; set; }    //--> Candidate
    }
我一直在寻找,所以我找到了这个解决方案,但我没有得到的方法


因此,如果没有任何解决方法,我如何实现多对一映射呢?

Automapper的ConstructUsing对于从自定义代码构建一个属性非常有用。在你的情况下,这不是真的必要。您只需要创建从对象到DTO的映射。然后将每个对象实例映射到相同的DTO实例

但是,由于Automapper希望定义目标对象的每个属性,以确保完全指定目标,因此您需要将源对象中不存在的属性配置为忽略

CreateMap<Candidate, CandidateTextInfo>()
.ForMember(x=> x.ProfilePicture, opt => opt.Ignore())
.ForMember(... 
// repeat for all destination properties not existing in source properties
CreateMap()
.ForMember(x=>x.ProfilePicture,opt=>opt.Ignore())
.ForMember(。。。
//对源属性中不存在的所有目标属性重复此操作

如果这是太多的样板代码,那么会有很多关于堆栈溢出的解决方案,其中有一个看起来很有希望:(看看Robert Schroeder的答案)

这在很大程度上取决于对象之间的关系。如果对象之间的关系为1:1(例如,如果
User
具有属性
User.Candidate
User.Portfolio
),则映射很容易:-

CreateMap<User, CandidateTextInfo>()
  .ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.ProfilePicture)
  // ...
  .ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
  // And so on...

我知道这个答案已经很晚了,但是如果你进一步指定对象之间的关系,我可以帮助你创建一个更具体的映射。

这些类是如何关联的?它们相互引用吗?你可以根据命名约定使用AutoMapper的展平。它们之间有共同的id,但只有yo make“逻辑”关系,它们之间没有对象或嵌套引用
public class CandidateTextInfoSource
{
  public CandidateTextInfoSource(User user,
                                 Candidate candidate,
                                 Portafolio portafolio)
  {
    this.User = user;
    this.Candidate = candidate;
    this.Portafolio = portafolio;
  }

  public User User { get; set; }
  public Candidate Candidate { get; set; }
  public Portafolio Portafolio { get; set; }
}

// ...

CreateMap<CandidateTextInfoSource, CandidateTextInfo>()
  .ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.User.ProfilePicture)
   // ...
  .ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
   // And so on...
CreateMap<User, IEnuemerable<CandidateTextInfoSource>>()
  .ConstructUsing(
    x => x.Candidates
          .Select(y => Mapper.Map<CandidateTextInfo>(new CandidateTextInfoSource(x, y, y.Portfolio)))
  .ToList());