我有一个场景,当前在一个页面上使用了 Telerik radgrid(webforms),该页面当前允许 Telerik 控制分页、排序、过滤等。但是我注意到,因为这对这些任务使用了默认的 Telerik 行为,所以它在内存所以没有什么是延迟加载的。
在这种情况下,会返回超过 300,000 行(一次为 120 万行),并且这似乎在每次分页、排序等时重新查询,这非常慢。
现在我想将这些问题推送到服务器端,因为目前数据库交互是通过 linq to sql 发生的,所以我想而不是仅仅使用基础(300k 查询)采用可组合的 IQueryable,然后添加过滤、排序和分页来自telerik控件的逻辑,因为数据似乎都在那里,我只是不知道什么时候应该拦截控件数据绑定以强制它只获取它需要的数据。
从我目前的调查来看,有一个OnSortCommand
方法似乎在请求排序时触发,所以我假设我可以从那里得到SortExpression
并将其放入 linq 查询中,然后还有一个FilterExpression
我可以用来约束结果在查询中,最后是PageSize
和CurrentPageIndex
变量,可以让我计算出我应该带回多少页。
因此,约束查询所需的所有数据都存在于那里,但是我不知道什么时候应该拦截绑定过程,就像我要拦截OnDataBinding
并覆盖当前一样,DataSource
以考虑到过滤器表达式和分页详细信息(因为排序不可用,直到据我所知的排序命令)然后我希望只有一个查询可以拉回 50 行(或任何页面大小),但是它似乎执行 300k 查询,然后执行 50 行查询,所以我我很困惑我是否应该拦截另一个事件或方法。
如果有人能指出我应该拦截/覆盖的方向,我将非常感激,因为 Telerik 为此提供的文档并不是那么好。
== 编辑 ==
只是为了更具体地了解场景,我并不是真的想在内部创建数据源(高级数据绑定),因为它们需要是可重用的组件,所以控件是在 aspx 页面上创建的,然后在后面的代码中在页面加载时,它将使用描述查询的 IQueryable 对象(300k 对象)设置,然后在这个继承的控件中,DataSource
我希望能够使用filterexpression
、sortexpression
和追加到查询中。所以数据源是在这个类外部提供的。pagesize
pageindex
== 编辑 2 ==
只是为了让更多人关注我困惑的症结,目前对我来说最莫名其妙的事情之一是我的网格正在执行 3 个查询:
- 一种是从 IQueryable 中获取虚拟行数,这样可以按预期返回计数
- 第二个是未更改的 300k 查询,我不知道为什么会发生这种情况
- 第三个是带回 50 行的更改查询
由于我已经覆盖了该OnDataBinding
方法,因此我不知道它还会从哪里提取这些数据,因为在DataSource
结束之前更新了该OnDataBinding
方法,然后更改了 IQueryable。因此,Telerik Land
当我不想要它时,它会在某些时候做一些事情来获取这些数据,为什么要做一个巨大的查询来获取所有数据,然后只查询最少的数量?没有意义...