2017-02-16 5 views
0

こんにちは私はAuto Mapを使用して動作しない条件付きエンティティをマップしますが、After Mapではうまく動作しません。使用する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)) 

このギブエラー

式ツリーラムダはヌル伝搬演算子を含めることはできません。私はAftermapを使用している場合、それは正常に動作しますWhy can't I use the null propagation operator in lambda expressions?

によって説明される

自動マッパーでは何もありませんか?私はAfterMapを使用しないとこれを達成できますか?条件もありますが、linq式も使用しています。

アイデア?

答えて

1

あなたは-ing Selectによって非常に簡単です

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

?.オペレータに代替を見つける必要があり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))) 
関連する問題