阻止Kendo Grid运行两个查询
本文关键字:两个 查询 Kendo Grid 运行 阻止 | 更新日期: 2023-09-27 18:26:08
当前,当我将DataSource附加到Kendo网格时,它会运行两个查询。
第一个:是一个Count(*)
,用于创建正确的页数并通知用户存在多少记录。
第二个:是基于每页显示的行数的TOP
查询。
我的问题是即使使用.Pageable(p => p.Enabled(false).Info(false))
,它仍然在运行Count(*)查询。
我正在运行的查询非常昂贵,我想完全取消运行第一个Count(*)查询。
如果您想将数据分离到页面中,您必须找到从服务器获取计数的方法。你就是绕不过去。
正如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(*)花费的时间太长,那么您只有很多行,所以关闭分页会使情况变得更糟,因为它会获取所有行并将它们发送回客户端。