我正在使用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) –