我使用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-使用ICriteria
和SetProjections
,如下所示
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;
}
}
现在我的问题是哪一个有更好的表现?为什么呢?
答案 0 :(得分:2)
我认为获得更好的指标的最佳方法将如此处所述。去下载nhProf并对其进行分析。
如果你想要更多细节,请使用生成的sql,然后通过SQL Server分析器运行它,以更好地了解它正在做什么。
但老实说,如果您的数据库中有任何数量的数据,执行LIKE查询会给您带来可怕的糟糕结果。
我强烈建议您在SQL Server中设置全文索引,然后使用:
注册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
参数...