Question

Je vous écris même requête avec approche à deux en utilisant NHibernate:

1 en utilisant HQL comme ci-dessous

public long RetrieveHQLCount<T>(string propertyName, object propertyValue)
{
    using (ISession session = m_SessionFactory.OpenSession())
    {
        long r = Convert.ToInt64(session.CreateQuery("select count(o) from " + typeof(T).Name + " as o" + " where o." + propertyName + " like '" + propertyValue + "%'").UniqueResult());
        return r;
    }
}

2 en utilisant ICriteria et SetProjections comme ci-dessous

public long RetrieveCount<T>(string propertyName, object propertyValue)
{
    using (ISession session = m_SessionFactory.OpenSession())
    {
        // Create a criteria object with the specified criteria
        ICriteria criteria = session.CreateCriteria(typeof(T));
        criteria.Add(Expression.InsensitiveLike(propertyName, propertyValue))
            .SetProjection(Projections.Count(propertyName));

        long count = Convert.ToInt64(criteria.UniqueResult());

        // Set return value
        return count;
    }
}

Maintenant, ma question est celle que l'on a de meilleures performances? pourquoi?

Était-ce utile?

La solution

Je pense que la meilleure façon d'obtenir une métrique qui est de mieux serait comme cela a été dit ici. Go télécharger nhProf et profil il.

http://nhprof.com/

Si vous voulez plus de détails, prendre la sql qui est généré et puis exécutez-le par profileur SQL Server pour obtenir une meilleure idée de ce qu'il fait.

Mais honnêtement, si vous avez une quantité de données dans votre base de données faisant une requête comme vous donnera des résultats horribles HORRIBLE.

Je recommande fortement que vous configurez l'indexation de texte intégral dans SQL Server puis utilisez ceci:

http://nhforge.org/blogs/nhibernate/archive/2009/03/13/registering-freetext-or-contains-functions-into-a-nhibernate-dialect.aspx

pour enregistrer le texte libre et contient des fonctions dans nHibernate.

un autre exemple d'intégrer des requêtes ICriteria est ici:

http: // xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/

Vous pouvez également utiliser Lucene.NET pour faire l'indexation en texte intégral ainsi.

Autres conseils

Il n'y a pas de différence significative de la performance intrinsèque entre HQL et critères. Ils sont juste différents API pour exprimer une requête qui à la fin sera traduit à SQL, c'est tout.

Les critères (sans jeu de mots) pour choisir une API sur l'autre dépend du contexte d'utilisation. Par exemple, dans votre cas particulier, je partirais avec des critères. Création d'une requête de concaténation de chaîne est assez sujette à erreur et vous devez être très prudent de ne pas être vulnérables aux attaques par injection . Au moins l'ensemble propertyValue être un paramètre IQuery ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top