我还在努力理解automapper是如何工作的。我有下面的EF Core查询,我想把它改成使用automapper。
var query = from t in Context.Tririga.AsNoTracking()
let l = t.Building
let m = t.Owner
let o = m.Organization
where o.Active
select new MetricBadLabManagerByOrganizationDTO {
CampusName = l.CampusName,
Email = m.Email,
Name = m.Name,
OrgLevel3 = o.ThreeName,
OrgLevel4 = o.FourName,
OrgLevel5 = o.FiveName,
OrgLevel6 = o.SixName,
OrgLevel7 = o.SevenName,
Reason = m.Active == false ? "Inactive Employee" : "Invalid Employee",
SiteName = l.SiteName,
Wwid = m.Wwid
};
return await query.ToArrayAsync();
我不确定如何设置映射器配置到DTO类型,因为我不能只是从Tririga到MetricBadLabManagerByOrganizationDTO,因为它不知道如何去关系。
如果你没有看过文档,这里是AutoMapper的入门指南。
我最近有机会从事一个项目,该项目使用AutoMapper在持久模型和领域模型之间进行转换,下面是我的设置方法:
配置映射的方法有很多。我喜欢Profile Instances方法:
using AutoMapper;
namespace Company.Product.Infrastructure.Mapping.AutoMapper
{
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Tririga, MetricBadLabManagerByOrganizationDTO>()
.ForMember(dest => dest.CampusName,
opts => opts.MapFrom(src => src.Building.CampusName))
.ForMember(dest => dest.Email,
opts => opts.MapFrom(src => src.Owner.Email))
.ForMember(dest => dest.Name,
opts => opts.MapFrom(src => src.Owner.Name))
...
}
}
}
在AutoMapper文档中有一整节是关于扁平化的。
只是一个提示,
当您在AutoMapper中配置源/目标类型对时,配置器会尝试将源类型上的属性和方法与目标类型上的属性进行匹配。如果目标类型上的属性、方法或以"Get"为前缀的方法在源类型上不存在,则AutoMapper将目标成员名拆分为单独的单词(按照PascalCase约定)。
因此,您可能不需要为要映射的每个属性定义规则,否则使用AutoMapper的意义何在?
例如,如果您的MetricBadLabManagerByOrganizationDTO
校园名称被命名为BuildingCampusName
,那么AutoMapper将足够聪明地在您的源代码中查找Building
属性,并查看是否有一个名为CampusName
的属性。
在AutoMapper文档中有很多有价值的信息,你可以从中找到和学习,这就是我喜欢的!