2011-08-03 10 views
6

¿Cómo puedo escribir la siguiente declaración de SQL utilizando QueryOver <> sintaxis?NHibernate QueryOver <> - Función de agregado sobre SubQuery

SELECT COUNT(*) FROM (
    SELECT FirstName,LastName 
    FROM People 
    GROUP BY FirstName, LastName 
    ) as sub_t 

tengo la consulta interna de trabajo hasta el momento:

var q = _session.QueryOver<Person>() 
    .SelectList(l => l 
     .SelectGroup(x => x.FirstName) 
     .SelectGroup(x => x.LastName)); 

Pero no tengo idea de cómo envolver esto en una sub consulta y obtener un recuento de filas fuera de él. Se puede hacer?

Desafortunadamente, mi dialecto RDBMS (MsSqlCe40Dialect) no admite COUNT DISTINCT, por lo que no tengo la ventaja de usar SelectCountDistinct().

Respuesta

0

¿No es posible utilizar la propiedad RowCount de IQueryOver? De esta manera:

var totalRows = _session.QueryOver<Person>() 
.SelectList(l => l 
    .SelectGroup(x => x.FirstName) 
    .SelectGroup(x => x.LastName)).RowCount(); 
+1

Desafortunadamente GROUP BY no se conserva en su sugerencia, probé en SqlCe4 y SQL Server 2008. La consulta generada es "SELECT count (*) as y0_ FROM [People] this_" en ambos casos. – twerq

1

Ok, no sé las razones behing usando QueryOver, pero me gustaría hacer algo como esto, creo que le dará lo que busca:

Session.CreateCriteria<Person>() 
       .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.GroupProperty("FirstName"))) 
        .Add(Projections.GroupProperty("LastName"))) 
       .List<Person>().Count(); 

Espero que ayude ...

+0

Desafortunadamente eso no produce el SQL deseado: toda la lista de registros (que puede ser enorme) se carga en el código .NET antes de contarla. – twerq

1

No estoy familiarizado con QueryOver, pero he usado la siguiente función de agregado cuando una sub consulta no fue posible para este tipo de conteo, pensé que podría ser útil, y al publicar descubrí algunos problemas que no conocía anteriormente, así que los publiqué también.

Nota: es aproximadamente 10 veces más lento con cantidades de datos moderadas.

método agregado

SELECT 
COUNT(DISTINCT FirstName+LastName) 
FROM People 

adaptarse a casos especiales

nombres de combinación similares "Joe Smith" vs "Joes Mith" (Asume ~ no está en el conjunto de datos)

SELECT 
COUNT(DISTINCT FirstName+'~'+LastName) 
FROM People 

nulls (As sumes^No esta en el conjunto de datos)

SELECT 
COUNT(DISTINCT IsNull(FirstName,'^')+'~'+IsNull(LastName,'^')) 
FROM People 

espacios en blanco finales, parece RTRIM es intrínseca al Grupo Por

SELECT 
COUNT(DISTINCT IsNull(RTrim(FirstName),'^')+'~'+IsNull(Rtrim(LastName),'^')) 
FROM People 

Benchmarking (80k filas de datos sobre AMD Single Quad Core)

80-100ms - ejecutar el método de consulta secundaria (ver OP)

800-1200ms - método agregado con distinc t, acomodarse para casos especiales no parece marcar una gran diferencia.

Cuestiones relacionadas