我正在使用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%的加速。
那麼你可以讓NHibernate的執行中的硬編碼SQL你的代碼,但是你放棄了NHibernate爲類型安全(從類到數據庫對象的強類型輸入)提供的好處,對數據庫引擎是不可知的(更復雜的SQL不會在所有數據庫上運行),延遲加載,緩存等。我會建議,除非絕對必要,並且您肯定不會切換數據庫引擎,不要在代碼中使用硬編碼的SQL與NHibernate。 –
硬編碼SQL比沒有好,我害怕。 進一步研究,Criteria不需要按照正確的順序進行,我應該可以使用ExpressionSQL。 我的查詢是關於使用分區上的ROW_NUMBER來獲取每個子分組中的第一項的SQL的特定位。分頁之前需要哪個。 – zeristor
有一個經驗豐富的團隊可以幫助你在這個論壇上:http://sqlserver.ro,試試吧 –