NHibernate QueryOver Подзапрос

Я смотрел на подобные вопросы, но не могу найти простое объяснение. Я мог пропустить это, но обещаю, что посмотрел. На самом деле, я даже не могу найти документацию, кроме одного поста в блоге, в котором все быстро освещается и предполагается, что вы знакомы с другими формами NH.

Учитывая много ко многим междуProgram а такжеTopicгде последний находится в иерархииTopicsЯ хочу получить всеPrograms для данногоTopicВозможно, включая его подтемы. Поскольку программа может быть указана в нескольких подтемах данной родительской темы, мне нужно использовать подзапрос или иметь дело с необходимостью использовать разные (и простой подходTransformUsing(Transformers.DistinctRootEntity) не работал).

Сырой SQL должен быть что-то вроде

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

Результаты преобразуются в тип модели для передачи в представление. Моя первая попытка была такая:

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

Очевидно, что здесь выполняется объединение вместо подзапроса, но я не могу найти пример выполнения подзапроса со многими ко многим, как это.

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

Ответы на вопрос(2)

Ваш ответ на вопрос