NHibernate QueryOver Subquery
Eu olhei para perguntas semelhantes, mas não consigo encontrar uma explicação simples. Eu poderia ter perdido, mas prometo que olhei. Na verdade, não consigo encontrar outra documentação além de uma única postagem no blog que revele tudo rapidamente e pressupõe que você esteja familiarizado com outras formas de N
Dado um muitos-para-muitos entreProgram
eTopic
, onde o último está em uma hierarquia deTopics
, Quero recuperar todos osPrograms
para um dadoTopic
, possivelmente incluindo seus subtópicos. Como um programa pode ser listado em vários subtópicos de um determinado tópico pai, preciso usar uma subconsulta ou lidar com a necessidade de usar distintas (e a abordagem simples deTransformUsing(Transformers.DistinctRootEntity)
não funcionou
Raw SQL deve ser algo como
SELECT ProgramId, Title, bar, baz, foo FROM Programs
WHERE ProgramId IN
(SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))
Os resultados são convertidos em um tipo de modelo para transferência para a vista. Minha tentativa inicial foi:
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, isso executa uma junção em vez de uma subconsulta, mas não consigo encontrar um exemplo de como fazer uma subconsulta com muitos para muitos como ess
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; }
...
}