5

我正在使用Criteria加快查詢速度,而且我快到了。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%的加速。

+0

那麼你可以讓NHibernate的執行中的硬編碼SQL你的代碼,但是你放棄了NHibernate爲類型安全(從類到數據庫對象的強類型輸入)提供的好處,對數據庫引擎是不可知的(更復雜的SQL不會在所有數據庫上運行),延遲加載,緩存等。我會建議,除非絕對必要,並且您肯定不會切換數據庫引擎,不要在代碼中使用硬編碼的SQL與NHibernate。 –

+0

硬編碼SQL比沒有好,我害怕。 進一步研究,Criteria不需要按照正確的順序進行,我應該可以使用ExpressionSQL。 我的查詢是關於使用分區上的ROW_NUMBER來獲取每個子分組中的第一項的SQL的特定位。分頁之前需要哪個。 – zeristor

+0

有一個經驗豐富的團隊可以幫助你在這個論壇上:http://sqlserver.ro,試試吧 –

回答

0

我不知道性能,但你可以使用LINQ:

變化:

.List<DealSearch>(); 

要:

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

使用Criteria的想法是在服務器上進行處理,因此減少要傳輸到服務器的數據。 對於NHibernate的LINQ只能在數據交付後才能使用。 儘管SQL Server上有.NET,但我還沒有想過。 – zeristor

+0

Got ya',我錯過了關於做服務器端的部分(這非常合理),我只是想要獲得一個獨特的結果集。我現在沒有時間查看,但是您是否使用DistinctEntityRootTransformer查看了SetResultTransformer? –