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.
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. –
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
Existe un equipo experimentado que podría ayudarlo en este foro: http://sqlserver.ro, intentelo –