2017-02-16 137 views
0

嗨我使用自動映射器來映射條件實體,它不工作,不使用後映射,但工作正常後,我沒有贏得地圖' t使用。 我想從Domain.PermanentPlacement映射InvoiceLineCreditHeader,但有條件。自動映射器映射條件實體,不使用不工作後地圖

以下是映射代碼。

MauritiusMapper.CreateMap<Domain.PermanentPlacement, InvoiceLineCreditHeader>() 
           .ForMember(desc => desc.ApplicantName, o => o.MapFrom(source => source.Candidate.FullName)) 
           .ForMember(desc => desc.DatePlaced, o => o.MapFrom(source => source.PlacementDate)) 
           .ForMember(desc => desc.ApproveDate, o => o.MapFrom(source => source.LastAuditItem.DateOfAction)) 
           .ForMember(desc => desc.CheckedBy, o => o.MapFrom(source => source.StartCheckedBy)) 
           .ForMember(desc => desc.Job, o => o.MapFrom(source => source.JobTitle)); 

     MauritiusMapper.CreateMap<InvoiceLineCreditSearchResult, InvoiceLineCreditData>() 
      .ForMember(d => d.InvoiceLineCredits, o => o.MapFrom(s => s.Credits)) 
      .ForMember(d => d.InvoiceLineCreditHeader, o => o.MapFrom(s => s.InvoiceLine)) 
      .ForMember(d => d.CreditReasons, o => o.MapFrom(s => s.CreditReasons)) 
      .ForMember(d => d.CreditStatuses, o => o.MapFrom(s => s.CreditStatuses)) 
      .ForMember(d => d.InvoiceLineCreditHeader, o => o.MapFrom(s => s.InvoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine>().FirstOrDefault()?.PermanentPlacement ?? s.ReissuePermanentPlacement)) 

這給予錯誤

表達式樹lambda不能包含空傳播算子。

這是由Why can't I use the null propagation operator in lambda expressions?

解釋的。如果我用Aftermap,它工作正常。

 MauritiusMapper.CreateMap<InvoiceLineCreditSearchResult, InvoiceLineCreditData>() 
      .ForMember(d => d.InvoiceLineCredits, o => o.MapFrom(s => s.Credits)) 
      .ForMember(d => d.InvoiceLineCreditHeader, o => o.MapFrom(s => s.InvoiceLine)) 
      .ForMember(d => d.CreditReasons, o => o.MapFrom(s => s.CreditReasons)) 
      .ForMember(d => d.CreditStatuses, o => o.MapFrom(s => s.CreditStatuses)) 
      //.ForMember(d => d.InvoiceLineCreditHeader, o => o.MapFrom(s => s.InvoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine>().FirstOrDefault()?.PermanentPlacement ?? s.ReissuePermanentPlacement)) 
      .AfterMap((s, d) => 
      { 
       var placement 
       = s.InvoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine>().FirstOrDefault()?.PermanentPlacement ?? s.ReissuePermanentPlacement; 
       // if (placement == null) return; 


       d.InvoiceLineCreditHeader.ApplicantId = placement.ApplicantId; 
       d.InvoiceLineCreditHeader.ApplicantName = placement.Candidate.FullName; 
       d.InvoiceLineCreditHeader.Job = placement.JobTitle; 
       d.InvoiceLineCreditHeader.DatePlaced = placement.PlacementDate; 
       d.InvoiceLineCreditHeader.PlacedBy = placement.PlacedBy; 
       d.InvoiceLineCreditHeader.ApprovedBy = placement.ApprovedBy; 
       d.InvoiceLineCreditHeader.ApproveDate = placement.LastAuditItem.DateOfAction; 
       d.InvoiceLineCreditHeader.CheckedBy = placement.StartCheckedBy; 
       d.InvoiceLineCreditHeader.StartDate = placement.StartDate; 
      }); 

是否有任何方法在自動映射器我可以實現這一點,而不使用AfterMap?還有條件,但它也使用linq表達式。

任何想法?

回答

1

你需要找到替代?.運營商

s.InvoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine>() 
    .FirstOrDefault()?.PermanentPlacement 

這是Select -ing很簡單PermanentPlacementFirstOrDefault

s.InvoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine>() 
    .Select(e => e.PermanentPlacement).FirstOrDefault() 
1

您可以創建所需的邏輯獨立的方法:

private InvoiceLineCreditHeader GetInvoiceLineCreditHeader(InvoiceLineCreditSearchResult result) 
{ 
    // todo: get InvoiceLineCreditHeader conditionally 
    InvoiceLineCreditHeader header = new InvoiceLineCreditHeader(); 
    return header; 
} 

並且將其稱爲:

.ForMember(d => d.InvoiceLineCreditHeader, o => o.MapFrom(s => GetInvoiceLineCreditHeader(s)))