Kendo UI jQuery 网格服务器端过滤
Kendo UI jQuery Grid Server Side Filtering
我正在使用 Kendo UI 的 jQuery 网格来显示一些数据。到目前为止,我正在使用客户端过滤和分页,其中所有数据记录都在对服务器的初始调用中返回(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
class ) 但过滤器永远不会正确映射到那个。我也知道 [FromUri]
和 [FromBody]
选项的使用,所以无需提及任何此类解决方案:)
我的下一个担心是,即使以某种方式(现在假设)我能够将过滤器和其他参数正确映射到某些 DTO 我们如何才能在我们的数据源上实际使用这些过滤器,这实际上是由 Dapper SQL 查询组成。
此外,我还想避免手动过滤器解析和生成动态 where 子句。
就 Kendo 文档而言,虽然有此类可行的演示,但服务器功能要么不存在,要么可用的功能对我们没有多大用处,如下所示:
public ActionResult Remote_Binding_Orders_Read([DataSourceRequest]DataSourceRequest request)
{
return Json(GetOrders().ToDataSourceResult(request));
}
正如在 Kendo jQuery 网格中尝试过的那样,过滤器永远不会映射到 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。
毕竟无法找到一些解决方法(即使是 telerik 支持也只是周而复始,无法提出任何解决方法)。
因此决定自定义实现(还为所有可能 运行 相同的开发人员创建了一个甜蜜的 nuget)。
因此必须手动生成可用于创建动态 WHERE、ORDER BY、GROUP BY 和 SELECT(用于聚合)子句的表达式。
有关详细信息,请参阅以下存储库:
KendoGridFASMS
还有 nuget 包:
Nuget Package
此外,存储库对所有人开放以供进一步自定义:)
截至 2020 年 3 月 16 日:
库现在也支持 .NET Core 和 .NET Standard Frameworks。
我正在使用 Kendo UI 的 jQuery 网格来显示一些数据。到目前为止,我正在使用客户端过滤和分页,其中所有数据记录都在对服务器的初始调用中返回(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
class ) 但过滤器永远不会正确映射到那个。我也知道 [FromUri]
和 [FromBody]
选项的使用,所以无需提及任何此类解决方案:)
我的下一个担心是,即使以某种方式(现在假设)我能够将过滤器和其他参数正确映射到某些 DTO 我们如何才能在我们的数据源上实际使用这些过滤器,这实际上是由 Dapper SQL 查询组成。
此外,我还想避免手动过滤器解析和生成动态 where 子句。
就 Kendo 文档而言,虽然有此类可行的演示,但服务器功能要么不存在,要么可用的功能对我们没有多大用处,如下所示:
public ActionResult Remote_Binding_Orders_Read([DataSourceRequest]DataSourceRequest request)
{
return Json(GetOrders().ToDataSourceResult(request));
}
正如在 Kendo jQuery 网格中尝试过的那样,过滤器永远不会映射到 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。
毕竟无法找到一些解决方法(即使是 telerik 支持也只是周而复始,无法提出任何解决方法)。
因此决定自定义实现(还为所有可能 运行 相同的开发人员创建了一个甜蜜的 nuget)。
因此必须手动生成可用于创建动态 WHERE、ORDER BY、GROUP BY 和 SELECT(用于聚合)子句的表达式。
有关详细信息,请参阅以下存储库: KendoGridFASMS
还有 nuget 包: Nuget Package
此外,存储库对所有人开放以供进一步自定义:)
截至 2020 年 3 月 16 日:
库现在也支持 .NET Core 和 .NET Standard Frameworks。