Domanda

Scrivo stessa query con due approccio utilizzando NHibernate:

1- utilizzando HQL come qui di seguito

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- utilizzando ICriteria e SetProjections come qui di seguito

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;
    }
}

Ora la mia domanda è quella che si ha la migliore prestazione? perché?

È stato utile?

Soluzione

Penso che il modo migliore per ottenere una metrica di cui è meglio sarebbe come è stato detto qui. Go scaricare nhProf e il profilo it.

http://nhprof.com/

Se volete maggiori dettagli prendere la SQL che viene generato e quindi eseguirlo tramite SQL Server Profiler per ottenere un'idea ancora migliore di quello che sta facendo.

Ma, onestamente, se avete qualsiasi quantità di dati nel database facendo una query come vi darà risultati ORRIBILE orribili.

vi consiglio vivamente di impostare l'indicizzazione full-text in SQL Server e quindi utilizzare questo:

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

per registrare il FREETEXT e contiene funzioni in NHibernate.

un altro grande esempio di integrazione con le query ICriteria è qui:

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

In alternativa è possibile utilizzare Lucene.NET per fare l'indicizzazione testo completo pure.

Altri suggerimenti

Non v'è alcuna significativa differenza di prestazioni intrinseca tra HQL e criteri. Sono solo le API differenti per esprimere una query che alla fine si tradurrà a SQL, il gioco è fatto.

I criteri (senza giochi di parole) scegliere un'API sull'altro dipende dal contesto di utilizzo. Ad esempio, nel vostro caso particolare, mi piacerebbe andare con criteri. Costruzione di una query da concatenazione di stringhe è abbastanza soggetto a errori e bisogna essere molto attenti a non essere vulnerabili ad attacchi di iniezione . Almeno set il propertyValue per essere un parametro di IQuery ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top