私はクライテリアを使ってクエリを高速化していますが、私はほとんどそこにいます。NHibernate Criteria QueryByExampleが真ん中にSQLを貼り付けた
Query By Exampleを使用すると、テーブル内の行を照合し、同じIDを持つ重複する行を削除して改ページすることができます。
もちろん、重複する行を削除するまでは改ページできません。その方法はわかりません。これはSQLで行うことができますが、それは流暢なコードに適合しますが、ISQLQueryはICriteriaオブジェクトを返しません。私が読んだ
public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
{
var startRow = startingPage * pageSize;
// Query By Example.
var example = Example.Create(exampleEntitySearch)
.IgnoreCase()
.EnableLike(MatchMode.Anywhere)
.ExcludeZeroes();
var results = this.Session.CreateCriteria(typeof(EntitySearch))
.Add(example)
// select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
.SetFirstResult(startRow)
.SetMaxResults(pageSize)
.List<DealSearch>();
return results;
}
アドバイスは、NHibernateのでSQLクエリを記述することですが、私は気の利いた「パーティションSQL超えるROW_NUMBER()」を変換する方法を考えることはできません。私はそれを最初に終わらせるために働く終わりにしたい、そしてそれをよりエレガントにしたいと思います。
私は生産にこのスパイクを取得し、〜90%のスピードアップを証明したいと思います。
.List<DealSearch>();
:
さてあなたはNHibernateのは、ハードコーディングされたSQLを実行させることができますがあなたのコードではなく、NHibernateがタイプセーフティ(クラスのマップからDBオブジェクトへの強い型付け)、DBエンジンに無関係(より複雑なSQLはすべてのDB上で実行されない)のような利点を提供します。遅延ロード、私は絶対に必要でない限り、あなたがDBエンジンを決して切り替えることは確実でない限り、ハードコードされたSQLをNHibernateのコードで使用しないことをお勧めします。 –
ハードコードされたSQLは何もないより優れています、私は恐れています。 もう少し調べると、Criteriaは正しい順序である必要はなく、ExpressionSQLを使用できるはずです。 私のクエリは、各サブグループの最初の項目を取るために、パーティション上でROW_NUMBERを使用するSQLの特定のビットに達しました。ページネーションの前に必要なもの。 – zeristor
経験豊富なチームがこのフォーラムであなたを助けてくれるかもしれません:http://sqlserver.ro、試してみてください –