NHibernate QueryOver Subconsulta
He examinado preguntas similares, pero no puedo encontrar una explicación simple. Podría haberlo perdido, pero prometo que miré. En realidad, ni siquiera puedo encontrar la documentación que no sea una sola publicación de blog que pasa por alto todo rápidamente y asume que estás familiarizado con otras formas de NH.
Dado un muchos a muchos entreProgram
yTopic
, donde este último está en una jerarquía deTopics
, Quiero recuperar todas lasPrograms
para una dadaTopic
, posiblemente incluyendo sus subtemas. Dado que un programa puede aparecer en varios subtemas de un tema principal determinado, necesito usar una subconsulta o tratar de tener que usar distintos (y el enfoque simple deTransformUsing(Transformers.DistinctRootEntity)
no funcionó).
Raw SQL debería ser algo así como
SELECT ProgramId, Title, bar, baz, foo FROM Programs
WHERE ProgramId IN
(SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))
Los resultados se convierten en un tipo de modelo para transferir a la vista. Mi intento inicial fue este:
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, esto ejecuta una unión en lugar de una subconsulta, pero no puedo encontrar un ejemplo de hacer una subconsulta con muchos a muchos como este.
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; }
...
}