2

我已经仔细查看了这个问题的答案,有几个问题表明这无法完成。

带有子集合的休眠投影

NHibernate QueryOver 投影 - 将集合投影到 DTO

NHibernate Projections - 如何投影集合

所以我想知道将子集合投影到我的 DTO 将是一个很好的解决方法。我需要运行两个单独的投影并手动将孩子添加到父母吗?

我正在使用 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 查询,您只需进行一次数据库往返即可获取所有信息。

编辑:

为了让哪些雇主映射到哪些提供者。

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 回答