我需要在Kendo网格上应用自定义服务器排序。 他是我的实体:
public class User
{
public virtual ICollection<Region> Regions { get; set; }
//other properties
}
public class Region
{
public string Name { get; set; }
}
我想按Regions集合中第一个区域的名称对用户进行排序。对于其他排序,使用了过滤和分页.ToDataSourceResult(request)
扩展方法,但似乎我的方案不支持开箱即用。这就是为什么我首先尝试手动排序IQuearable
,删除SortDescriptor
然后调用.ToDataSourceResult(request)
:
private IQueryable<User> FilterByRegions(IQueryable<User> users, IList<SortDescriptor> sortings)
{
var regionsSort = sortings?.FirstOrDefault(x => x.Member == "Regions");
if (regionsSort == null)
return users;
sortings.Remove(regionsSort);
Expression<Func<User, object>> exp = user => user.Regions.OrderBy(x => x.Name).Select(x => x.Name).FirstOrDefault();
if (regionsSort.SortDirection == ListSortDirection.Ascending)
return users.OrderBy(exp);
else
return users.OrderByDescending(exp);
}
用法:
public ActionResult Read([DataSourceRequest] DataSourceRequest request)
{
IQueryable<User> users = _userApplicationService.GetAll();
users = FilterByRegions(users, request.Sorts);
DataSourceResult result = users.ToDataSourceResult(request);
return Json(result, JsonRequestBehavior.AllowGet);
}
但似乎调用.ToDataSourceResult(request)
会忽略我以前的排序。
如何达到预期效果?在使用IQueryable
之前,是否可以向.ToDataSourceResult(request)
添加一些自定义逻辑?
我知道可以使用DataSourceRequest request
手动构建查询,但这很糟糕,因为我有很多不同的过滤器和排序。
谢谢。
答案 0 :(得分:0)
我有类似的要求,我必须使用Kendo Grid实现自定义服务器端分页和排序。根据{{3}},您应该将ToDataSourceResult扩展方法中的request参数更改为空请求,而不是传入参数请求。
所以
d
应更改为v
。这样做有助于我正确实现服务器端分页和排序。