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 BlogPosts 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.

¿Fue útil?

Solución

Sé que esta pregunta se puso hace algún tiempo, pero lo que quiero hacer de la misma cosa, por favor, eche un vistazo a mi pregunta aquí , y este tipo aquí , tal vez se puede utilizar la idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top