Seleccionar en Sub Consultas en NHibernate con Critieria API

Entonces tengo una consulta SQL con la siguiente estructura:

select p.* from ( select max([price]) as Max_Price, [childId] as childNodeId from [Items] group by [childId] ) as q inner join [Items] as p on p.[price] = q.[Max_Price] and p.[childId] = q.[childNodeId] 

Necesito volver a crear esta consulta en NHibernate, utilizando la API de Criteria. Intenté usar la API de Subconsultas, pero parece requerir que la consulta interna devuelva una sola columna para verificar la igualdad con una propiedad en la consulta externa. Sin embargo, devuelvo dos. He leído que esto se puede lograr a través de la API de HQL, pero tengo que hacerlo con la API de Criteria, ya que vamos a generar dinámicamente consultas como esta sobre la marcha. ¿Alguien puede dirigirme en la dirección correcta aquí?

He logrado resolver un problema similar al adaptar ligeramente la consulta SQL original. Terminé con algo así (código pseudo sql):

 SELECT p.* FROM [Items] as p WHERE EXISTS ( SELECT [childId] as childNodeId FROM [Items] as q WHERE p.[childId] = q.[childNodeId] GROUP BY q.[childId] HAVING p.[price] = MAX(q.[price]) ) 

Y esta es la implementación de QueryOver:

 var subquery = QueryOver.Of(() => q) .SelectList(list => list.SelectGroup(() => q.ChildId)) .Where(Restrictions.EqProperty( Projections.Property(() => p.Price), Projections.Max(() => q.Price))) .And(Restrictions.EqProperty( Projections.Property(() => p.ChildId), Projections.Property(() => q.ChildId))); 

Desde aquí solo necesita pasar los alias para que NHibernate pueda resolver entidades correctamente (pseudo código):

 var filter = QueryOver.Of(() => p) .WithSubquery.WhereExists(GetSubQuery(p, criteria...)); 

Espero que esto ayude en tu caso particular.

ACTUALIZACIÓN: API de criterios

 var subquery = DetachedCriteria.For<Items>("q") .SetProjection(Projections.ProjectionList() .Add(Projections.GroupProperty("q.ChildId"))) .Add(Restrictions.EqProperty("p.Price", Projections.Max("q.Price"))) .Add(Restrictions.EqProperty("p.ChildId", "q.ChildId")); var query = DetachedCriteria.For<Items>("p") .Add(Subqueries.Exists(subquery)); 

Sin embargo, recomendaría seguir con la versión de QueryOver , es mucho más intuitiva y evita las cadenas mágicas (especialmente que no tiene que actualizar la versión de NH).

Por favor, avíseme si esto funciona para usted.