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