5

Estoy usando Criteria para acelerar una consulta, y ya casi estoy allí.NHibernate Criterios QueryByExample pegado con SQL en el medio

Usando Query By Example para hacer coincidir las filas en una tabla, elimine las filas duplicadas con la misma identificación, y luego paginate.

Por supuesto, no puedo paginar hasta que elimine las filas duplicadas, y no sé cómo hacerlo. Se puede hacer en SQL, pero eso encaja con el código fluido, ISQLQuery no devuelve un objeto ICriteria.

public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize) 
    { 
     var startRow = startingPage * pageSize; 

     // Query By Example. 
     var example = Example.Create(exampleEntitySearch) 
      .IgnoreCase() 
      .EnableLike(MatchMode.Anywhere) 
      .ExcludeZeroes(); 

     var results = this.Session.CreateCriteria(typeof(EntitySearch)) 
           .Add(example) 
     // select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1 
           .SetFirstResult(startRow) 
           .SetMaxResults(pageSize) 
           .List<DealSearch>(); 

     return results; 
    } 

consejo que he leído es escribir la consulta SQL en NHibernate, pero no se me ocurre cómo convertir la "ROW_NUMBER() sobre SQL partición" ingenioso. Me gustaría hacerlo funcionar de principio a fin primero, y luego hacerlo más elegante.

Me gustaría poner este pico en producción y demostrar que el ~ 90% de velocidad.

+0

bien que se puede hacer NHibernate ejecutar SQL modificable en su código, pero luego pierde un montón de las ventajas que NHibernate le da como seguridad tipo (tipificación fuerte del mapa de clases a objetos DB), siendo agnóstico al motor DB (SQL más complicado no se ejecutará en todos los DB), carga lenta, almacenamiento en caché, etc. Lo recomendaría, a menos que sea absolutamente necesario y esté seguro de que nunca cambiará los motores de DB, no use SQL codificado en código con NHibernate. –

+0

SQL codificado duro es mejor que nada, me temo. Investigando un poco más, los Criterios no necesitan estar en el orden correcto, y yo debería poder usar ExpressionSQL. Mi consulta se refería al bit específico de SQL que usa ROW_NUMBER sobre la partición para tomar el primer elemento en cada subgrupo. Que se necesita antes de la paginación. – zeristor

+0

Existe un equipo experimentado que podría ayudarlo en este foro: http://sqlserver.ro, intentelo –

Respuesta

0

no estoy seguro sobre el rendimiento, pero se puede usar LINQ:

Cambio:

.List<DealSearch>(); 

Para:

.List<DealSearch>().Distinct().ToList(); 
+0

La idea al usar Criteria es hacer el procesamiento en el servidor, y así reducir los datos que se transferirán al servidor . LINQ for NHibernate solo funcionará después de que se hayan entregado los datos. Sin embargo, existe .NET en SQL Server, algo en lo que no había pensado. – zeristor

+0

Te tengo ", me perdí la parte de hacerlo en el lado del servidor (lo cual tiene perfecto sentido), solo estaba buscando obtener un conjunto de resultados distinto. No tengo tiempo para mirar en este momento, pero ¿has mirado a SetResultTransformer usando DistinctEntityRootTransformer? –

Cuestiones relacionadas