AutoMapper使用linq映射嵌套属性

本文关键字:嵌套 属性 映射 linq 使用 AutoMapper | 更新日期: 2023-09-27 18:26:43

我需要映射父对象中嵌套对象的一个属性。假设我有users,它有roles,但角色有一个名为TransRoles的转换对象,最后一个具有属性Description,这就是我想要的。

DTO类

UsersDTO标记:

public partial class UserDTO
{
    public short Id { get; set; }
    /* ... */
    public virtual RolesDTO RolesDTO { get; set; }
}

RolesDTO标记:

public class RolesDTO
{
    public int Id { get; set; }
    public string Description { get; set; } // Mapping destination
    /* ... */
}

数据访问类

Users标记:

public partial class User
{
    public short Id { get; set; }
    /* ... */
    public virtual Roles Roles { get; set; }
}

Roles标记:

public class Roles
{
    public int Id { get; set; }
    public virtual ICollection<TransRoles> TransRoles { get; set; }
    // this class doesn't have the description    
    /* ... */
}

TransRoles标记:

public class TransRoles
{
    public int Id { get; set; }
    public string Description { get; set; } // Mapping source
    /* ... */
}

我有以下代码,但我想要的Users.Roles.TransRoles.Description的描述没有加载到UsersDTO.RolesDTO.Description:

Mapper.CreateMap<User, UserDTO>();
// Dependencies
Mapper.CreateMap<Roles, RolesDTO>()
    .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.TransRoles.FirstOrDefault().Description));

如果我手动映射属性,它是有效的,但我认为如果我使用库映射器:

Mapper.CreateMap<User, UserDTO>();
Mapper.CreateMap<Roles, RolesDTO>();
// Manually mapping
UserDTO UserDTO = Mapper.Map<UserDTO>(User);
UserDTO.RolesDTO.Descripcion = User.Roles.TransRoles.FirstOrDefault().Description;

AutoMapper使用linq映射嵌套属性

我必须找到主对象的所有内部引用,在我的示例中,RolesDTO有不止一个子对象。此外,我目前正在使用Oracle11和EF6.0,这个版本不支持查询中的APPLY,所以包括了不按预期工作的地方。

TLDR

映射对象时始终使用Mapper.AssertConfigurationIsValid();,这样您就不会错过任何东西,如果您使用的是带有EF 6.0的Oracle 11,请小心。