Я смотрел на подобные вопросы, но не могу найти простое объяснение. Я мог пропустить это, но обещаю, что посмотрел. На самом деле я даже не могу найти документацию, кроме одного поста в блоге, в котором все быстро затушевывается и предполагается, что вы знакомы с другими формами 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; }
...
}