2

私はこれに関する回答をよく調べましたが、いくつかの質問はこれができないことを示唆しています。

子コレクションを使用した Nibernate プロジェクション

NHibernate QueryOver プロジェクション - DTO へのコレクションのプロジェクション

NHibernate Projections - コレクションを投影する方法

だから私は、子コレクションを私のDTOに投影するための良い回避策は何だろうと思っていました. 2 つの別々のプロジェクションを実行し、手動で子を親に追加する必要がありますか?

私はNH 3.3.1を使用しています。次のDTOデータ構造があります

 public class ProviderDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<EmployerDTO> Employers { get; set; }
}


 public class EmployerDTO
{
    public int Id { get; set; }
    public string Name { get; set; }

}

射影を使用して、プロバイダーと雇用主のドメイン エンティティをこの構造にマップしたいと考えています。(この単純なシナリオでは、私のドメイン エンティティは私の dto のものと非常によく似ています)

Employer employerAlias = null;
Provider providerAlias = null;
ProviderDto providerDto = null;

var dto = session.QueryOver<Provider>(() => providerAlias)
            .JoinAlias(x => x.Employers, () => employerAlias)
            .Where(()=> providerAlias.Id == 1)
            .Select(Projections.ProjectionList()
            .Add(Projections.Property(() => providerAlias.Id).WithAlias(() => providerDto.Id))
            .Add(Projections.Property(() => providerAlias.Name).WithAlias(() => providerDto.Name))

              //This is where I cannot project my child employer collection
            .TransformUsing(Transformers.AliasToBean<ProviderDto>()).List<ProviderDto>();

子コレクション全体にマップするにはどうすればよいですか? どうもありがとう。

4

1 に答える 1

2

先物を使用してクエリをバッチ処理し、関係を自分で構築する必要があります。

Employer employerAlias = null;
Provider providerAlias = null;
ProviderDto providerDto = null;
EmployerDto employerDto = null;

var providers = session.QueryOver<Provider>(() => providerAlias)
        .JoinAlias(x => x.Employers, () => employerAlias)
        .Where(()=> providerAlias.Id == 1)
        .Select(Projections.ProjectionList()
        .Add(Projections.Property(() => providerAlias.Id).WithAlias(() =>    providerDto.Id))
        .Add(Projections.Property(() => providerAlias.Name).WithAlias(() => providerDto.Name))
        .TransformUsing(Transformers.AliasToBean<ProviderDto>()).Future<ProviderDto>();

var employers = session.QueryOver<Employer>(() => employerAlias)
//Etc 
.TransformUsing(Transformers.AliasToBean<EmployerDto>()).Future<EmployerDto>();

次に、正しい雇用者をプロバイダーにマッピングする必要があります。そのためには DTO でより多くの情報が必要になる場合がありますが、Future クエリを使用すると、すべての情報を取得するために 1 回のデータベース ラウンドトリップを行うだけで済みます。

編集:

どの雇用者がどのプロバイダーにマップされているかを取得するため。

session.QueryOver(() => provider)
       .JoinAlias(() => provider.Employers, () => employer)
       .SelectList(list => list.Select(() => provider.Id).WithAlias(() =>     peDTO.ProviderId)
                               .Select(() => employer.Id).WithAlias(() =>     peDTO.EmployerId))
       .TransformUsing(Transformers.AliasToBean<ProviderEmployerMapDTO>()).Future<ProviderEmployerMapDTO>();
于 2013-06-24T19:53:07.650 に答える