阻止Kendo Grid运行两个查询

本文关键字:两个 查询 Kendo Grid 运行 阻止 | 更新日期: 2023-09-27 18:26:08

当前,当我将DataSource附加到Kendo网格时,它会运行两个查询。

第一个:是一个Count(*),用于创建正确的页数并通知用户存在多少记录。

第二个:是基于每页显示的行数的TOP查询。

我的问题是即使使用.Pageable(p => p.Enabled(false).Info(false)),它仍然在运行Count(*)查询。

我正在运行的查询非常昂贵,我想完全取消运行第一个Count(*)查询。

阻止Kendo Grid运行两个查询

如果您想将数据分离到页面中,您必须找到从服务器获取计数的方法。你就是绕不过去。

正如CodingWithSpike所指出的,在一个页面中显示所有行可能比获得计数(*)花费更多的时间,因此目前几乎没有解决方案。

A) 您可以固定单个页面中要获取的最大行数。只需确保用户意识到这一限制即可。

B) 如果表中的记录数稳定,则可以在服务器上缓存计数。

C) 您也可以在服务器端缓存表数据。这将加快计数和数据提取的速度。然而,您需要考虑它对服务器内存的影响,以及从缓存中获取的数据可能不是最新的(您可以考虑每X分钟刷新一次数据)。

如果您想使用选项B或C,您可能必须实现自己的读取逻辑(dataSource.transport对象的),以便在服务器上获取缓存的数据。

编辑

我知道你永远不会超过100排,所以我提出了一个混合解决方案。类似于A),除了将在客户端计算的计数:

D) 重写dataSource.transport的读取逻辑,以便仅从服务器检索前100行。Read函数有一个选项参数对象,可用于以网格将处理的格式返回数据(例如:OData对象)。

通常,OData对象返回的计数将是在服务器上计算的内联计数,以让您知道有多少记录符合您的过滤器。在您的情况下,它将始终是OData对象中返回的行数,因此在调用成功函数之前,您可以在客户端设置它,而无需对服务器进行任何调用。

以下是关于transport.read的Kendo文档(请参阅集读取为函数部分)

尝试关闭dataSource(而不仅仅是网格)上的服务器分页。在javascript中,它将是DataSource.serverPaging选项。不确定MVC助手到底是什么。

然而,我怀疑,如果从表中获取count(*)花费的时间太长,那么您只有很多行,所以关闭分页会使情况变得更糟,因为它会获取所有行并将它们发送回客户端。