NHibernate QueryOver Subquery

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

Учитывая связь «многие ко многим» между программой и темой , где последняя находится в иерархии тем , я хочу получить все Программы для данной темы , возможно, включая ее подтемы. Поскольку программа может быть указана в нескольких подтемах данной родительской темы, мне нужно использовать подзапрос или иметь дело с необходимостью использовать отдельный (и простой подход 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; }
    ...
}
9
задан Carl Bussema 15 February 2012 в 15:24
поделиться