5 votes

NHibernate Criteria QueryByExample coincé avec du SQL au milieu

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%.

0voto

BaTTy.Koda Points 128

Je ne suis pas sûr des performances, mais vous pourriez utiliser LINQ :

Changez :

.List<DealSearch>();

A :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X