我正在使用Asp網絡5,NHibernate 3.3和Kendo UI MVC包裝網格呈現客戶端訂單表。數據庫中已經有很多訂單,並且數量在不斷增長。所以我決定使用服務器端分頁來避免從數據庫獲取所有訂單。據我所知,你不能手動分頁,並委託過濾,排序和分組ToDataSourceResult方法。它可以是全部或全部。因此我試圖實施所謂的'custom binding'。沒有問題,直到我分組。我需要先進行分組,然後在組內進行排序,然後提取特定頁面的數據以及所有內容,而不將所有數據加載到內存中。我的代碼是這樣的(我把它都在一塊,以方便閱讀):劍道網格服務器端分組
var orderList = CurrentSession.QueryOver<Order>();
// Filtering. Filter is a search string obtained from DataSourceRequest
var disjunction = new Disjunction();
disjunction.Add(Restrictions.On<Order>(e => e.Number).IsLike("%" + filter + "%"));
disjunction.Add(Restrictions.On<Order>(e => e.Customer).IsLike("%" + filter + "%"));
orderList = orderList.Where(disjunction);
// Sorting. sortColumn is also from DataSourceRequest
switch (sortColumn)
{
case "Number":
orderList = orderList.OrderBy(x => x.Number).Desc;
break;
case "GeneralInfo.LastChangeDate":
orderList = orderList.OrderBy(x => x.LastChangeDate).Desc;
break;
default:
orderList = orderList.OrderBy(x => x.Number).Desc;
break;
}
}
// Total is required for kendo grid when you do paging manually
var total = orderList.RowCount();
var orders = orderList
.Fetch(x => x.OrderGoods).Eager
.Fetch(x => x.OrderComments).Eager
.Fetch(x => x.Documents).Eager
.Fetch(x => x.Partner).Eager
.Skip((request.Page - 1)*request.PageSize).Take(request.PageSize).List();
我會很高興對如何添加分組這裏的任何建議。
非常感謝你這樣詳細的解答!你提供的示例項目工作得很好,它演示了我需要的行爲。這將是一個很好的起點。順便說一下,我很驚訝地看到解決方案非常棘手。 Telerik在這裏肯定有一些改進空間。 – vsevolod
我很高興它解決了!我完全同意解決方案很棘手;它不應該很難執行服務器端分組。祝你好運! –
而不是使用Telerik的DataSourceRequest,你也可以嘗試使用[KendoGridBinderEx](https://github.com/StefH/KendoGridBinderEx) –