2016-01-12 19 views
1

Automapper能夠深​​入到實體導航屬性中以映射到DTO類嗎?下面是我在做什麼,從實體框架查詢結果映射到DTO:Automapper可以使用實體的導航屬性從相關實體中提取值

  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); 

如果可以做到這一點的是做正確的方法是什麼?

回答

1

你看看擴展Queryable Extensions爲自動映射器它有一個擴展.ProjectTo可能會幫助你與你試圖達到什麼,否則你將需要創建一個給定的情況下映射配置。

的東西,如

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

不,它不能向下鑽取到性能,因爲它不知道應該如何深得或含糊不清怎麼辦。

默認情況下,它只會自動映射具有相同名稱的屬性,所以這已經爲您節省了一些代碼,但您仍然需要教它如何映射其他屬性。它也可以將列表映射到另一個列表,如果它們所持有的類型彼此映射(這將消除對循環的需要)。

請注意,如果具有相同名稱的屬性不具有相同類型,則還需要爲它們添加映射(如果它們不能相互轉換)。

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; 
}