J'utilise des critères pour accélérer une requête, et j'y suis presque.
Utilisation de Query By Example pour faire correspondre les lignes d'une table, supprimer les lignes en double ayant le même identifiant, puis paginer.
Bien sûr, je ne peux pas paginer tant que je n'ai pas supprimé les lignes en double, et je ne sais pas comment faire. Cela peut être fait en SQL, mais alors cela s'inscrit dans le code fluide, l'ISQLQuery ne renvoie pas un objet 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;
}
Le conseil que j'ai lu est d'écrire la requête SQL dans NHibernate, mais je n'arrive pas à trouver comment convertir l'astucieux "ROW_NUMBER() over partition SQL". Je voudrais d'abord le faire fonctionner de bout en bout, puis le rendre plus élégant.
J'aimerais mettre ce pic en production et prouver l'augmentation de vitesse de ~90%.