NHibernate QueryOver Subconsulta

He examinado preguntas similares, pero no puedo encontrar una explicación simple. Podría haberlo perdido, pero prometo que miré. En realidad, ni siquiera puedo encontrar la documentación que no sea una sola publicación de blog que pasa por alto todo rápidamente y asume que estás familiarizado con otras formas de NH.

Dado un muchos a muchos entreProgram yTopic, donde este último está en una jerarquía deTopics, Quiero recuperar todas lasPrograms para una dadaTopic, posiblemente incluyendo sus subtemas. Dado que un programa puede aparecer en varios subtemas de un tema principal determinado, necesito usar una subconsulta o tratar de tener que usar distintos (y el enfoque simple deTransformUsing(Transformers.DistinctRootEntity) no funcionó).

Raw SQL debería ser algo así como

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

Los resultados se convierten en un tipo de modelo para transferir a la vista. Mi intento inicial fue este:

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>();    

Obviamente, esto ejecuta una unión en lugar de una subconsulta, pero no puedo encontrar un ejemplo de hacer una subconsulta con muchos a muchos como este.

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; }
    ...
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta