2009-12-15 28 views
0

我使用jqGrid來顯示使用NHibernate檢索的數據。 jqGrid爲我做分頁,我只是告訴NHibernate從「n」開始的「count」行。jqGrid/NHibernate/SQL:導航到選定的記錄

此外,我想強調具體的記錄。例如,在員工列表中,我希望特定的員工(id)在表格中顯示和預選。

問題是此員工可能在非當前頁面上。例如。我從0顯示20行,但「高亮顯示」員工是#25,並在第二頁。

可以將初始頁面傳遞給jqGrid,因此,如果我以某種方式使用NHibernate來查找「高亮顯示」員工所在的頁面,它將只導航到該頁面,然後使用.setSelection(id )jqGrid的方法。

所以,問題被縮小到這個問題:給出特定的搜索查詢,如下所示,我如何告訴NHibernate計算「高亮」員工所在的頁面?

示例查詢(簡體):

var query = Session.CreateCriteria<T>(); 
foreach (var sr in request.SearchFields) 
    query = query.Add(Expression.Like(sr.Key, "%" + sr.Value + "%")); 
query.SetFirstResult((request.Page - 1) * request.Rows) 
query.SetMaxResults(request.Rows) 

在這裏,我需要改變(計算)request.Page,以便它指向的地方request.SelectedId是頁面。

另外,有趣的是,如果未定義排序順序,當我運行搜索查詢兩次時,是否會得到相同的結果?我會說,SQL Server 可能優化查詢,因爲訂單沒有定義...在這種情況下,我只會得到可預見的結果,如果我拉全部查詢數據一旦,然後將以編程方式在C#切片查詢結果的指定部分 - 以便不發生第二個查詢。但它當然會慢得多。

或者,有沒有另一種方法?

回答

0

確定,所以目前我這樣做:

var iquery = GetPagedCriteria<T>(request, true) 
        .SetProjection(Projections.Property("Id")); 
    var ids = iquery.List<Guid>(); 
    var index = ids.IndexOf(new Guid(request.SelectedId)); 
    if (index >= 0) 
     request.Page = index/request.Rows + 1; 

,並在jqGrid的設置選項

 url: "${Url.Href<MyController>(c => c.JsonIndex(null))}?_SelectedId=${Id}", 
     // remove _SelectedId from url once loaded because we only need to find its page once 
     gridComplete: function() { 
      $("#grid").setGridParam({url: "${Url.Href<MyController>(c => c.JsonIndex(null))}"}); 
     }, 
     loadComplete: function() { 
      $("#grid").setSelection("${Id}"); 
     } 

也就是說,在請求我查找了ID的指標,並設置頁面,如果發現(jqGrid的連理解在尋呼機中顯示適當的頁碼,因爲我將頁碼返回到json數據中)。在網格設置中,我將url設置爲首先包含查找ID,但在網格加載後,我將它從url中移除,以便prev/next按鈕可以工作。不過,我總是嘗試突出顯示網格中選定的ID。

當然,我總是使用排序或方法將無法正常工作。

一個問題仍然存在的是,我從數據庫中提取所有ids,這是一點性能影響。如果有人可以告訴如何在過濾/排序後的查詢中找到id的索引,我會接受答案(因爲這是真正的問題);如果沒有,那麼我會接受我自己的答案;-)

更新:嗯,如果我按id排序最初我將能夠使用技術,如「選擇計數(*)...在哪裏id < selectedid 」。這將消除「拉IDS」的問題......但我最初想按名稱排序,無論如何。

更新:實施後,我發現這種技術的整潔副作用......排序時,活動/選定的項目被保留;-)如果_SelectedId只在頁面更改時重置,當網格加載時。

更新:這裏的來源包括上述技術:http://sprokhorenko.blogspot.com/2010/01/jqgrid-mvc-new-version-sources.html

0

很確定你必須找出另一個查詢頁面。這肯定會要求您定義要排序的列。您需要通過限制和限制一起對特定ID之前的行進行計數。一旦在你的id之前有行數,你可以確定你需要選擇什麼頁面並執行通常的分頁查詢。

+0

不知道該怎麼辦,我得到的ID之前下訂單的數量?如果查詢按id排序很容易,但它通常按名稱或類似的順序進行排序......目前,我將只從服務器獲取ID列表(同時仍然進行排序和過濾),並在其中執行IndexOf(id) 。 – queen3 2009-12-16 08:37:16

+0

如果按名稱排序,則需要查找id的名稱並限制爲小於或大於(取決於排序方向)該行的名稱和計數的行。 – dotjoe 2009-12-16 14:28:42

+0

如果有幾個相同的名字?這是通向地獄的道路;-) – queen3 2009-12-16 15:57:04