【问题标题】:Can Automapper use an entity's navigation properties to pull values from related entitiesAutomapper 可以使用实体的导航属性从相关实体中提取值吗
【发布时间】:2016-04-17 18:48:26
【问题描述】:

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。我尝试了以下方法,但它可能不起作用,因为我需要需要导航到其他实体(例如 Employee、Department 和 ProductProfile)的信息:

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

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

【问题讨论】:

    标签: c# linq-to-entities entity-framework-6 automapper dto


    【解决方案1】:

    您是否查看过自动映射器的扩展名Queryable Extensions,它有一个扩展名 .ProjectTo,这可能会帮助您实现您想要实现的目标,否则您将需要为给定的案例创建一个映射配置。

    类似

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

    【讨论】:

      【解决方案2】:

      不,它无法深入研究属性,因为它不知道应该深入到多深或如何处理歧义。

      默认情况下,它只会自动映射具有相同名称的属性,因此这已经为您节省了一些代码,但您仍然需要教它如何映射其他属性。如果它们持有的类型之间存在映射,它还可以将一个列表映射到另一个列表(这将消除对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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多