NHibernate QueryOver Sous-Requête

J'ai regardé les questions similaires, mais ne peut pas trouver une explication simple. J'ai peut-être manqué, mais je promets que j'ai regardé. En fait, je ne peux même pas trouver la documentation sur l'autre que d'un seul post de blog qui occulte tout rapidement et suppose que vous êtes familier avec d'autres formes de NH.

Donné un plusieurs-à-plusieurs entre Program et Topic, où ce dernier est dans une hiérarchie de Topics, je veux récupérer tous les Programs pour un Topic, éventuellement, y compris ses sous-rubriques. Depuis un programme peuvent être répertoriés sous plusieurs sous-thèmes d'un parent sujet, j'ai besoin d'utiliser une sous-requête ou de traiter avec avoir à utiliser distinct (et la simple approche de TransformUsing(Transformers.DistinctRootEntity) n'a pas fonctionné).

SQL brut doit être quelque chose comme

SELECT ProgramId, Title, bar, baz, foo FROM Programs 
WHERE ProgramId IN 
 (SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))

Les résultats sont exprimés dans un type de modèle pour le transfert à la vue. Ma première tentative a été ceci:

ProgramDTO pDTO = null;

/* topicIds is List<int> passed into function */

var query = Session.QueryOver<Program>()
.JoinQueryOver<Topic>(p => p.Topics)
.WhereRestrictionOn(pt => pt.Id).IsInG<int>(topicIds)     
.TransformUsing(Transformers.DistinctRootEntity)
.SelectList(list => list
        .Select(program => program.Id).WithAlias(() => pDTO.Id)
        .Select(program => program.Title).WithAlias(() => pDTO.Title)
        .Select(program => program.Location).WithAlias(() => pDTO.Location)
        .Select(program => program.Description).WithAlias(() => pDTO.Description)
)
.TransformUsing(Transformers.AliasToBean(typeof(ProgramDTO)));

return query.List<ProgramDTO>();    

Évidemment, cela fonctionne une jointure au lieu d'une sous-requête, mais je ne peux pas trouver un exemple de faire une sous-requête avec plusieurs-à-plusieurs de ce genre.

public class Program : Entity {
    public virtual ISet<Topic> Topics { get; protected internal set; }
     ...
}

public class Topic : Entity {
    public virtual ISet<Program> Programs { get; protected internal set; }
    public virtual Topic ParentTopic { get; protected internal set; }
    ...
}

OriginalL'auteur Carl Bussema | 2012-02-14