Pregunta

escribo misma consulta con dos enfoque mediante el uso de NHibernate:

1- utilizando HQL como a continuación

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- utilizando ICriteria y SetProjections como a continuación

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

Ahora mi pregunta es la que se tiene un mejor rendimiento? ¿Por qué?

¿Fue útil?

Solución

creo que la mejor manera de obtener un indicador de que está mejor sería como se indica aquí. Ir descarga nhProf y el perfil de la misma.

http://nhprof.com/

Si usted desea más detalles tome el SQL que se genera y luego ejecutarlo a través de perfiles de SQL Server para obtener una mejor idea de lo que está haciendo.

Pero, honestamente, si usted tiene cualquier cantidad de datos en su base de datos haciendo una consulta como le dará resultados HORRIBLE horrible.

Yo recomendaría encarecidamente que configure la indexación de texto completo en SQL Server y luego usar esto:

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

para registrar el texto libre y contiene funciones de NHibernate.

otro gran ejemplo de integración con consultas ICriteria está aquí:

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

Alternativamente, puede utilizar Lucene.NET hacer la indexación de texto completo también.

Otros consejos

No hay una diferencia significativa entre el rendimiento intrínseco HQL y Criterios. Son sólo diferentes APIs para expresar una consulta que al final va a ser traducido a SQL, eso es todo.

Los criterios (sin doble sentido) para elegir uno sobre el otro API depende del contexto de uso. Por ejemplo, en su caso particular, me gustaría ir con los criterios. La construcción de una consulta a partir de la concatenación de cadenas es muy propenso a errores y hay que tener mucho cuidado de no ser vulnerables a los ataques de inyección . Al menos el conjunto propertyValue a ser un parámetro IQuery ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top