2

NHibernateを使用して、2つのアプローチで同じクエリを記述します。

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

さて、私の質問は、どちらがより良いパフォーマンスを持っているかということです。なぜ?

4

2 に答える 2

2

HQL と Criteria の間に本質的なパフォーマンスの大きな違いはありません。これらは、最終的に SQL に変換されるクエリを表現するための異なる API にすぎません。それだけです。

ある API を他の API よりも優先して選択する基準 (しゃれは意図されていません) は、使用状況によって異なります。たとえば、あなたの特定のケースでは、基準を使用します。文字列の連結からクエリを作成すると、エラーが発生しやすくなり、インジェクション攻撃を受けないように細心の注意を払う必要があります。少なくとも をパラメータに設定しpropertyValueIQueryください...

于 2010-05-06T14:32:45.613 に答える
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

フリーテキストを登録し、nHibernate に関数が含まれています。

ICriteria クエリと統合する別の優れた例は次のとおりです。

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

または、Lucene.NET を使用して全文索引付けを行うこともできます。

于 2010-05-06T14:13:16.093 に答える