使用自动映射器设置属性值以与其他 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 个组合的主要内容,如果未能解决你的问题,请参考以下文章