簡體   English   中英

Automapper可以使用實體的導航屬性從相關實體中提取值

[英]Can Automapper use an entity's navigation properties to pull values from related entities

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

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

您是否已查看用於自動映射器的擴展Queryable Extensions ,它具有擴展名.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM