我正在使用Kendo UI for jQuery Grid显示一些数据。到目前为止,我正在使用客户端过滤和分页,其中所有数据记录都是在对服务器的初始调用中返回的(在服务器端使用了Web API和Dapper)。但是,随着数据源随着时间的增长,在一次调用中从服务器获取所有数据的想法不再可行。
我已使用以下选项启用了服务器端分页和过滤的选项:
serverPaging: true,
serverSorting: true,
serverAggregates: true,
serverFiltering: true,
过滤器和分页信息作为查询参数传递,例如:
take: 20
skip: 0
page: 1
pageSize: 20
filter[logic]: and
filter[filters][0][logic]: or
filter[filters][0][filters][0][value]: High
filter[filters][0][filters][0][operator]: eq
filter[filters][0][filters][0][field]: status
filter[filters][0][filters][1][value]: Medium
filter[filters][0][filters][1][operator]: eq
filter[filters][0][filters][1][field]: status
filter[filters][1][logic]: and
filter[filters][1][filters][0][field]: Name
filter[filters][1][filters][0][operator]: startswith
filter[filters][1][filters][0][value]: a
filter[filters][1][filters][1][field]: Name
filter[filters][1][filters][1][operator]: contains
filter[filters][1][filters][1][value]: a
因此,我们面临的第一个问题是尝试将这些过滤器和其他参数映射到某些Kendo提供的DTO(我们已经使用Kendo MVC控件DataSourceRequest
类),但是这些过滤器从未正确映射到该过滤器。我也知道使用[FromUri]
和[FromBody]
选项,因此无需提及任何此类解决方案:)
我接下来要担心的是,即使以某种方式(现在假设),我也能够正确地将过滤器和其他参数映射到某些DTO上,我们如何才能在数据源上实际使用这些过滤器,这实际上是由通过Dapper SQL查询。
我还希望避免手动过滤器解析并生成动态的where子句。
就Kendo文档而言,尽管有一个可行的演示,但服务器功能不存在或可用的功能对我们没有太大用,如下所示:
public ActionResult Remote_Binding_Orders_Read([DataSourceRequest]DataSourceRequest request)
{
return Json(GetOrders().ToDataSourceResult(request));
}
正如已经提到的,当从Kendo jQuery Grid进行尝试时,过滤器永远不会映射到DataSourceRequest
。
再一次,由于我们使用的是Dapper,以下代码也没有太大帮助:
public static IQueryable<OrderViewModel> ApplyOrdersFiltering(this IQueryable<OrderViewModel> data, IList<IFilterDescriptor> filterDescriptors)
{
if (filterDescriptors != null && filterDescriptors.Any())
{
data = data.Where(ExpressionBuilder.Expression<OrderViewModel>(filterDescriptors, false));
}
return data;
}
orders = orders.ApplyOrdersFiltering(request.Filters);
如果有人遇到相同的问题并找到了解决方法,那么这种帮助将不胜感激。
注意:不能选择从Dapper更改为Entity Framework,并且同样适用于Kendo jQuery Grid。
答案 0 :(得分:2)
毕竟找不到任何解决方法(即使是telerik支持也无法解决,也无法提出任何解决方法)。
因此决定采用自定义实现(也为可能遇到相同问题的所有开发人员创建了一个甜蜜的小工具)。
因此必须手动生成可用于创建动态WHERE,ORDER BY,GROUP BY和SELECT(用于聚合)子句的表达式。
有关更多详细信息,请参阅以下存储库: KendoGridFASMS
还有nuget包: Nuget Package
存储库也向所有人开放以供进一步定制:)