【发布时间】:2017-11-08 08:17:09
【问题描述】:
我需要在 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) 忽略了我之前的排序。
我怎样才能达到预期的效果?是否可以在使用.ToDataSourceResult(request) 之前向IQueryable 添加一些自定义逻辑?
我知道可以使用 DataSourceRequest request 手动构建查询,但它很糟糕,因为我有很多不同的过滤器和排序。
谢谢。
【问题讨论】:
-
它没有忽略。如果您有其他类型,则需要创建不同的表达式。这就是 Linq 的工作方式。请注意,您只能拥有一个
OrderBy...。任何进一步的将取代前一个。在 Linq 中,您需要使用ThenBy...。我的建议是在您明确发送区域名称时创建投影,然后修改请求排序以添加新的投影属性。 -
你可以尝试类似here的方法
标签: asp.net-mvc sorting kendo-grid kendo-asp.net-mvc