2014-10-10 46 views
1

目前,当我附上一个DataSource到剑道电网,它运行查询。防止剑道电网运行两个查询

第一:是Count(*)创建的打印的页数,并通知多条记录是如何存在的用户。

第二:是基于如何每页行数将显示TOP查询。

我的问题是即使与.Pageable(p => p.Enabled(false).Info(false))它仍然运行计数(*)查询。

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

回答

1

尝试关闭你的dataSource(不只是网格)的服务器分页。在JavaScript中,它将是DataSource.serverPaging选项。不确定它是什么与MVC助手。但是,我怀疑如果从你的表中获取一个count(*)需要很长的时间,那么你只需要很多行,所以关闭分页会让事情变得更糟,因为它会获取所有行,将它们发回给客户端。

2

如果你想分离数据到页面,你必须找到一种方法来从服务器获取计数。你无法绕过它。

由于CodingWithSpike指出,在单页显示所有行可能会采取的方式有更多的时间,它会得到COUNT(*),所以在这一点上,你有几种解决方案。

A)您修复了要在单个页面中获取的最大行数。只要确保用户知道这个限制。 B)如果表中的记录数量稳定,则可以在服务器上缓存计数。 C)你也可以在服务器端缓存表数据。它会加快计数和数据读取速度。但是,您需要考虑它是服务器内存的重量,以及从缓存中获取的数据可能不是最新的(您可以考虑每X分钟刷新一次数据)。

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

编辑

知道你永远不会得到超过100行我刚出来的时候与混合解决方案。与A相似),但客户端计算的计数除外:

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

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

这里的Kendo documentation about the transport.read(见集读作功能部分)

+0

所以这个表用于多个庞大的目录项之间的映射。这个想法是,我只会显示有史以来最好的100个结果。但是我们仍然想要利用IQueryable,所以如果用户在名称上执行了Kendo过滤器,它仍然会提供前100个结果。我们确实试图在后台的EF查询中说'query.Take(100)',但是如果你做了一个过滤器,它只会过滤掉那100个记录,而不是整个目录。 – Steve 2014-10-13 13:19:46

+1

因此,当你过滤你的100行时,你最终可能会得到另一组100行完全不同于原始集合? – 2014-10-13 13:30:57

+0

是的。我正在想着你在说什么,以及我有多深入到剑道的资源中,甚至可以实现这个目标。这可能是不可能的,我只是试图通过HALF降低运行时间,因为这个排名查询很昂贵。 基本上我想限制在前100名,我很好地禁用分页,但保持使用过滤器和排序来影响整个数据源的能力。 – Steve 2014-10-13 13:54:22