2011-04-21 11 views
12

Estoy tratando de obtener un recuento de una consulta con un grupo y no puedo encontrar la manera de traducir el SQL que quiero en la sintaxis QueryOver de NHibernate.NHibernate QueryOver: Obtenga un recuento de filas con group by en una subconsulta

Este es el SQL:

select count(*) from 
     (select Email from Entry 
     where (conditions...) 
     group by Email) as tmp 

parece sencillo ¿verdad?

Ésta es la forma en que estoy tratando de hacerlo, pero el() llamada RowCount parece optimizar el grupo de desaparecer por completo:

var query = _unitOfWork.CurrentSession.QueryOver<ContestEntry>() 
     .Select(Projections.Property<ContestEntry>(x => x.Email), 
       Projections.Group<ContestEntry>(x => x.Email)); 

    return query.RowCount(); 

no me importaría mediante los criterios para esto, pero me Estoy emocionado con la nueva (para mí) API QueryOver que me permite alejarme de las cadenas mágicas.

Actualización:

Soy incapaz de utilizar SQL generado que hace una consulta distinta dentro de una cuenta (por ejemplo, seleccionar la cuenta (distinto de correo electrónico)) ya que esta aplicación se ejecuta en SQL CE.

Ver: http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/ y http://our.umbraco.org/wiki/install-and-setup/sql-server-ce-4-known-issues ("Distinto en el recuento no es compatible", alrededor de 2/3 del camino hacia abajo de la página)

Respuesta

15

No estoy seguro de por qué necesita una consulta tan complejo. Si sólo desea que el recuento de mensajes de correo electrónico distintas cumplir ciertos criterios Creo que se podría usar algo como esto en SQL:

select count(distinct email) 
from Entry 
where (conditions...) 

y traducir esto a la API QueryOver de NHibernate sería algo como esto:

int count = session.QueryOver<ContestEntry>() 
      .Select(Projections.CountDistinct<ContestEntry>(x => x.Email)) 
      .FutureValue<int>() 
      .Value;//query is not executed until here 

A menos que me esté perdiendo algo, creo que obtendrá el resultado que busca. También hay una proyección "Distinct" y un método .ToRowCountQuery() que puede resultar interesante.

+0

Gracias Alex, tienes razón; esto funciona correctamente en SQL Server (y presumiblemente en otras bases de datos). Sin embargo, la aplicación en la que se ejecuta esto también usa SQL CE en algunas instancias y, por cualquier razón, SQL CE no admite el conteo de selecciones (distintas x). Consulte http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/ y http://our.umbraco.org/wiki/install-and- setup/sql-server-ce-4-known-issues – mmacaulay

+0

Marqué esta como la respuesta correcta, porque técnicamente lo es, siempre que use SQL Server. Para SQL CE, tuve que usar SQL en línea para que funcione. – mmacaulay

Cuestiones relacionadas