5

私はクライテリアを使ってクエリを高速化していますが、私はほとんどそこにいます。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>(); 

+0

さてあなたはNHibernateのは、ハードコーディングされたSQLを実行させることができますがあなたのコードではなく、NHibernateがタイプセーフティ(クラスのマップからDBオブジェクトへの強い型付け)、DBエンジンに無関係(より複雑なSQLはすべてのDB上で実行されない)のような利点を提供します。遅延ロード、私は絶対に必要でない限り、あなたがDBエンジンを決して切り替えることは確実でない限り、ハードコードされたSQLをNHibernateのコードで使用しないことをお勧めします。 –

+0

ハードコードされたSQLは何もないより優れています、私は恐れています。 もう少し調べると、Criteriaは正しい順序である必要はなく、ExpressionSQLを使用できるはずです。 私のクエリは、各サブグループの最初の項目を取るために、パーティション上でROW_NUMBERを使用するSQLの特定のビットに達しました。ページネーションの前に必要なもの。 – zeristor

+0

経験豊富なチームがこのフォーラムであなたを助けてくれるかもしれません:http://sqlserver.ro、試してみてください –

答えて

0

私はパフォーマンスについてわからないんだけど、あなたはLINQを使用することができます。

変更

.List<DealSearch>().Distinct().ToList(); 
+0

基準を使う上でのアイデアはサーバー上で処理を行い、サーバーに転送するデータを減らすことです。 NHibernateのLINQは、データが配信された後にのみ機能します。 SQL Server上には.NETがありますが、私が考えなかったことがあります。 – zeristor

+0

私はサーバー側(これは完璧な意味合いです)を行うことについての部分を逃しました。私は別個の結果セットを得ることを検討していました。私は今見たい時間がありませんが、あなたはDistinctEntityRootTransformerを使ってSetResultTransformerを見ましたか? –

関連する問題