2017-01-24 4 views
2

私は、ネストされた3つのエンティティフレームワークオブジェクトを持っています。また、私はそれらをマップするためにDTOと同様のオブジェクトを生成しました。3番目のレベルのプロパティにAutomapperを使用しているLINQ

だから私の質問は、companyDocumentオブジェクトが、私はすべての企業を選ぶためのクエリを実行ListCompanyDocumentsType、のリストを持っているとして、それは企業やその文書のリストをプラスして、文書タイプのリストを返し、あります各タイプがデータベース内に持つすべての文書のリスト(ループのような)。

1つのドキュメントタイプのみでcompanyDocumentを返す方法はありますか?または私はそれを間違って設計しましたか?この問題を解決するために、私はマップされたオブジェクトを使用しましたが、マップされていないDTOプロパティ内の型名を返すためにそれぞれを使用しました。それは働いていますが、それが正しいかどうかはわかりません。

また、EF .include()を使用してListCompanyDocumentTypesまで移動しようとしましたが、それぞれの型が持つすべてのドキュメントを返しています。

 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Company, CompanyDto>(); cfg.CreateMap<CompanyDocument,CompanyDocumentDto>();}); 
     var mapper = config.CreateMapper(); 

     var newDtoTest = mapper.Map<List<CompanyDto>>(companiesReturn); 

     var db = new entities(); 
     foreach (var companyDto in newDtoTest) 
     { 
      foreach (var companyDtoCompanyDocument in companyDto.CompanyDocuments) 
      { 
       companyDtoCompanyDocument.dtoTypeName = (await db.ListCompanyDocumentsTypes.FirstOrDefaultAsync(p=> p.id.Equals(companyDtoCompanyDocument.typeId))).typeName; 
      } 
     } 

Entity Framework Objects

あなたは特定のフィールドに適切な値を設定することができるようになります。この方法を使用して、ForMember()を使用する必要があり、

答えて

1

ありがとう:

cfg.CreateMap<Company, CompanyDto>() 
     .ForMember(dest => dest.dtoTypeName, opt => opt.MapFrom(src => src.CompanyDocuments.ListCompanyDocumentsTypes.FirstOrDefault().typeName)); 

companiesReturnIQueryable<Company>タイプである必要がありますので、サンプルメソッドGetAllCompany n EED CompanyDocumentsListCompanyDocumentsTypesが含まれており、次のようになります。

public IQueryable<AttributeElement> GetAll() 
{ 
     return CompanyRepository.GetQueryable() 
      .Include(d => d.CompanyDocuments) 
      .ThenInclude(d => d.ListCompanyDocumentsTypes); 
} 

Automapperは簡単にマッピングを持って、あなたはすべてのコンフィギュレーションクラスに設定することができ、追加のループを使用する必要はありません。

関連する問題