使用自动映射器设置属性值以与其他 2 个组合

Posted

技术标签:

【中文标题】使用自动映射器设置属性值以与其他 2 个组合【英文标题】:Set property value with automapper to combination with 2 other 【发布时间】:2021-12-28 08:17:43 【问题描述】:

我有员工表:

public class Employee

   public int Id get;set;
   public string FirstName get;set;
   public string LastName get;set;
   public int SupervisorId get;set;

SupervisorId 是同一个表(Employee)中指向其他员工的外键。

然后我有类似“EmployeeSupervisorDto”的东西

public class EmployeeSupervisorDto

   public int Id get;set;
   public string FirstName get;set;
   public string LastName get;set;
   public string FullNameSupervisor get;set;

我想要实现的是使用 automapper 将 FullNameSupervisor 自动设置为主管的 FirstName 和 LastName 的组合。

到目前为止尝试做这样的事情:

cfg.CreateMap<Employee, EmployeeSupervisorDto>()
    .ForMember(e => e.FullNameSupervisor, m => m.MapFrom(p => $"p.LastName p.FirstName"));

但我不知道如何引用 Id 来指出作为给定员工主管的员工 ID。

【问题讨论】:

【参考方案1】:

要使用以下解决方案,您需要将数据上下文注入自动映射器配置文件类(通过构造函数参数),此外,在 ConfigureServices 中,添加自动映射器配置文件的 DI,如 https://***.com/a/49198279/9907597 所示。

    在 AutoMapper 配置文件类中创建一个方法:

    public string GetEmployerFullName(int supervisorEmpId)
    
         var supervisor = db.Employees.Find(supervisorEmpId);
         return supervisor.FirstName + " " + supervisor.LastName;
    
    

    然后在automapper配置文件类构造函数中创建映射为:

    CreateMap<Employee, EmployeeSupervisorDto>()
        .ForMember(e => e.FullNameSupervisor, m => m.MapFrom(p => GetEmployerFullName(p.SupervisorId)));
    

【讨论】:

【参考方案2】:

如果您想使用一次而不是一般情况下,您可以使用ValueResolver 或类似此代码的代码:

Mapper.CreateMap<Employee, EmployeeSupervisorDto>()
.ForMember(e => e.FullNameSupervisor, o => o.ResolveUsing(m =>  return  m.LastName + m.FirstName));

【讨论】:

【参考方案3】:

可以帮助你, 我尝试使用 linq 方法:

public class Employee

   public int Id get;set;
   public string FirstName get;set;
   public string LastName get;set;
   public int SupervisorId get;set;
 

它为您提供带有 sup FullNameSupervisor 的员工列表

var Employeelist = new List<Employee>() ...;

var EmployeeWithSup = from ep in Employeelist 
                      join epsup in Employeelist on ep.SupervisorId equals epsup.Id
                      select new  Id = ep.Id,FirstName = ep.FirstName,LastName = ep.LastName,
                      SupervisorId = ep.SupervisorId,FullNameSupervisor = epsup.FirstName + " " + epsup.LastName ;

如果您想使用 automapper 进行连接,请尝试以下链接: AutoMapper to join records from 2 tables into single IEnumerable viewmodel

【讨论】:

以上是关于使用自动映射器设置属性值以与其他 2 个组合的主要内容,如果未能解决你的问题,请参考以下文章

对象引用未设置为对象实例的自动映射器问题

无法使用自动映射器映射内部导航属性。 EF 核心

当我的类中有属性具有默认构造函数来提供值自动映射器时,如何映射?

自动映射器。来自 json 的映射属性

如何在hadoop中组合两个独立映射器的结果?

‘终结点映射器中没有更多的终结点可用’