Por fin agregada subconsulta con NHibernate ICriteria o QueryOver
-
16-10-2019 - |
Pregunta
¿Hay una manera de lograr esto con SQL como NHibernate ICriteria o QueryOver?
select *
from [BlogPost] b
inner join (select blogpost_id, count(*) matchCount
from [Tag]
where name in ('tag X', 'tag Y')
group by blogpost_id
) tagmatch
on tagmatch.blogpost_id = b.Id
order by tagmatch.matchCount desc
El objetivo es entradas de blog fila por el número de etiquetas que coinciden de manera que un post con tanto etiqueta X y etiqueta Y está por encima de los mensajes con la etiqueta simplemente X .
Tengo esto hasta ahora:
DetachedCriteria
.For<Tag>("tag")
.Add(Restrictions.In(Projections.Property<Tag>(x => x.Name), tags.ToArray()))
.SetProjection(Projections.Group<Tag>(t => t.BlogPost))
.CreateCriteria("BlogPost")
.SetFetchMode("BlogPost", FetchMode.Eager)
.AddOrder(Order.Desc(Projections.RowCount()));
Sin embargo, la consulta resultante no se une a ir a buscar BlogPost
. En su lugar, devuelve sólo los identificadores, lo que conduce a seleccionar n + 1 cuando los BlogPost
s son iterados.
public class BlogPost
{
...
ISet<Tag> Tags {get; set;}
}
public class Tag
{
BlogPost BlogPost { get; set; }
string Name { get; set; }
}
Esto parece un problema similar.
¿Es esto ahora es posible con NHibernate 3?
Si no, ¿hay una solución alternativa?
Me puede cambiar el esquema y modelo de dominio si es necesario. No quiero utilizar SQL o HQL si es posible.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow