防止Kendo Grid运行两个查询

时间:2014-10-10 16:05:26

标签: c# sql kendo-ui kendo-grid kendo-asp.net-mvc

目前,当我将数据源附加到Kendo Grid时,它会运行两个查询。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

如果要将数据分成页面,则必须找到从服务器获取计数的方法。你无法解决它。

正如CodingWithSpike指出的那样,在单个页面中显示所有行可能会花费更多时间来获取计数(*),所以此时你几乎没有解决方案。

A)您可以在单个页面中修复要获取的最大行数。只需确保用户知道此限制。

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

C)您还可以在服务器端缓存表数据。它会加快计数和数据获取速度。但是,您需要考虑它在服务器内存上的权重以及从缓存中获取的数据可能不是最新的事实(您可以考虑每隔X分钟刷新一次数据)。

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

修改

知道你永远不会超过100行我刚刚推出了混合解决方案。与A)类似,除了将在客户端计算的计数:

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

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

这里是Kendo documentation about the transport.read(参见设置读取功能部分)

答案 1 :(得分:1)

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

但是,我怀疑如果从表中获取一个count(*)需要太长时间,那么你只有很多行,所以关闭分页会使事情变得更糟,因为它将获取所有行并发送他们回到客户端。