2011-04-18 16 views
16

Estoy tratando de convertir una consulta SQL a la sintaxis de NHibernate QueryOver, pero no entiendo cómo ordenar por la proyección de recuento.NHibernate QueryOver con MaxResult, Agrupar por y orden por

Esto es lo que la consulta SQL se parece a:

select top 10 v.intVoteUserID, COUNT(v.intVoteUserID) 
from Group_MessageVotes v 
where v.dtmVote > :date 
group by v.intVoteUserID 
order by COUNT(v.intVoteUserID) desc 

¿Alguna idea?

Respuesta

20

Simplemente puede repetir la proyección en la cláusula OrderBy.

La siguiente consulta le dará un IList<object[]>, donde el primer elemento de cada elemento es el ID y el segundo es el recuento.

var result = session.QueryOver<GroupMessageVotes>() 
.Select(
    Projections.Group<GroupMessageVotes>(e => e.intVoteUserID), 
    Projections.Count<GroupMessageVotes>(e => e.intVoteUserID) 
    ) 
.OrderBy(Projections.Count<GroupMessageVotes>(e => e.intVoteUserID)).Desc 
.Take(10) 
.List<object[]>(); 
+0

¿Se requieren todos estos argumentos genéricos? –

+1

@Stefan Steinegger Creo que son necesarios para las expresiones lambda. Es posible escribir 'Projections.Count (" intVoteUserID ") en su lugar, pero prefiero la primera opción. –

+0

Debería ser posible escribir 'Projections.Count (e => e.intVoteUserID)'. –