C# Automapper能否使用实体的导航属性从相关实体中提取值

C# Automapper能否使用实体的导航属性从相关实体中提取值,c#,linq-to-entities,entity-framework-6,automapper,dto,C#,Linq To Entities,Entity Framework 6,Automapper,Dto,Automapper是否能够深入实体导航属性以映射到DTO类?下面是我将实体框架查询的结果映射到DTO的步骤: public List<ProductRequestDetailDto> GetProductRequestExtendedDetailAll() { List<ProductRequest> aProductRequestList = unitOfWork.getProductRequestRepository(

Automapper是否能够深入实体导航属性以映射到DTO类?下面是我将实体框架查询的结果映射到DTO的步骤:

          public List<ProductRequestDetailDto> GetProductRequestExtendedDetailAll()
        {      
List<ProductRequest> aProductRequestList = unitOfWork.getProductRequestRepository().GetProductRequestExtendedDetailAll();

        List<ProductRequestDetailDto> ProductRequestDetailDtoList = new List<ProductRequestDetailDto>();

        foreach (ProductRequest Req in aProductRequestList)
        {
            ProductRequestDetailDto ProdReqDetDto = new ProductRequestDetailDto();
            ProdReqDetDto.ProductRequestId = Req.ProductRequestId;
            ProdReqDetDto.FirstName = Req.Employee.FirstName;
            ProdReqDetDto.MiddleInitial = Req.Employee.MiddleInitial;
            ProdReqDetDto.LastName = Req.Employee.LastName;
            ProdReqDetDto.DeptName = Req.Employee.Department.DeptName;
            ProdReqDetDto.DeviceType = Req.ProductProfile.DeviceType;
            ProdReqDetDto.ProductName = Req.ProductProfile.ProductName;
            ProdReqDetDto.ProductId = Req.ProductProfile.ProductId;
            ProdReqDetDto.ProductRequestStageId = Req.ProductRequestStage.ProductRequestStageId;
            ProdReqDetDto.DateRequested = Req.DateRequested;
            ProdReqDetDto.DateCompleted = Req.DateCompleted;
            ProdReqDetDto.SerialNumber = Req.SerialNumber;
            ProdReqDetDto.PhoneNumber = Req.PhoneNumber;

            ProductRequestDetailDtoList.Add(ProdReqDetDto);
        }

        return ProductRequestDetailDtoList;

    public List<ProductRequest> GetProductRequestExtendedDetailAll()
    {
        var ReportResult = from Req in context.ProductRequests
                           select Req;

        return ReportResult.ToList();
    }
如果Automapper能为我做的话,我想避免做上述事情。Automapper能够将结果映射到我的DTO,而我不需要深入到一个实体的导航属性,这会导致其他实体。我尝试了以下操作,但可能因为需要导航到其他实体(如员工、部门和ProductProfile)的信息而无法正常工作:

    List<ProductRequestDetailDto> ProductRequestDetailDtoList = Mapper.Map<List<ProductRequestDetailDto>>(aProductRequestList);

如果可以做到这一点,那么正确的方法是什么?

您是否查看了auto mapper的扩展,它有一个扩展。ProjectTo可能会帮助您实现您试图实现的目标,否则您需要为给定的情况创建映射配置

有点像

AutoMapper.Mapper.CreateMap<ProductRequestDetailDto, Req>()
    .ForMember(dest => dest.FirstName ,
               opts => opts.MapFrom(src => src.Employee.FirstName));

不,它无法深入到属性中,因为它不知道应该深入到多深,也不知道如何处理歧义

默认情况下,它只会自动映射具有相同名称的属性,因此这已经为您保存了一些代码,但您仍然需要教它如何映射其他属性。如果它们持有的类型彼此之间有映射,那么它还可以将列表映射到另一个列表,这样就不需要foreach循环

请注意,如果具有相同名称的属性不具有相同的类型,则如果它们彼此不可强制转换,则还需要为它们添加映射

public List<ProductRequestDetailDto> GetProductRequestExtendedDetailAll()
{    
    AutoMapper.Mapper.CreateMap<ProductRequest, ProductRequestDetailDto>()
        .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.Employee.FirstName))
        .ForMember(dest => dest.MiddleInitial, opt => opt.MapFrom(src => src.Employee.MiddleInitial))
        .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.Employee.LastName))
        .ForMember(dest => dest.DeptName, opt => opt.MapFrom(src => src.Employee.Department.DeptName))
        .ForMember(dest => dest.DeviceType, opt => opt.MapFrom(src => src.ProductProfile.DeviceType))
        .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductProfile.ProductName))
        .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ProductProfile.ProductId))
        .ForMember(dest => dest.ProductRequestStageId, opt => opt.MapFrom(src => src.ProductRequestStage.ProductRequestStageId));

    IQueryable<ProductRequest> aProductRequestList = unitOfWork.getProductRequestRepository().GetProductRequestExtendedDetailAll();

    List<ProductRequestDetailDto> ProductRequestDetailDtoList = aProductRequestList.ProjectTo<ProductRequestDetailDto>().ToList();

    // or also
    // List<ProductRequestDetailDto> ProductRequestDetailDtoList = aProductRequestList.Select(AutoMapper.Mapper.Map<ProductRequestDetailDto>).ToList();

    return ProductRequestDetailDtoList;
}

public IQueryable<ProductRequest> GetProductRequestExtendedDetailAll()
{
    var ReportResult = from Req in context.ProductRequests
                       select Req;

    return ReportResult;
}