哪一个有更好的表现?

时间:2010-05-06 10:45:36

标签: c# nhibernate orm hql icriteria

我使用NHibernate用两种方法编写相同的查询:

1-使用下面的HQL

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-使用ICriteriaSetProjections,如下所示

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

现在我的问题是哪一个有更好的表现?为什么呢?

2 个答案:

答案 0 :(得分:2)

我认为获得更好的指标的最佳方法将如此处所述。去下载nhProf并对其进行分析。

http://nhprof.com/

如果你想要更多细节,请使用生成的sql,然后通过SQL Server分析器运行它,以更好地了解它正在做什么。

但老实说,如果您的数据库中有任何数量的数据,执行LIKE查询会给您带来可怕的糟糕结果。

我强烈建议您在SQL Server中设置全文索引,然后使用:

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

注册freetext并包含nHibernate中的函数。

与ICriteria查询集成的另一个很好的例子是:

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

另外,您也可以使用Lucene.NET进行全文索引。

答案 1 :(得分:2)

HQL和Criteria之间没有明显的内在性能差异。它们只是用于表达查询的不同API,最终将被转换为SQL,就是它。

选择一个API而不是另一个API的标准(无双关语)取决于使用情况。例如,在您的特定情况下,我会选择Criteria。从字符串连接构建查询非常容易出错,您必须非常小心,不要vulnerable to injection attacks。至少将propertyValue设置为IQuery参数...