【发布时间】:2013-07-02 11:55:25
【问题描述】:
我有一个场景,目前在一个页面上使用了 Telerik radgrid(网络表单),该页面当前允许 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、@987654331 @ 和 pageindex 追加到查询。所以数据源是在这个类外部提供的。
== 编辑 2 ==
为了让更多人关注我困惑的症结,目前对我来说最莫名其妙的事情之一是我的网格正在执行 3 个查询:
- 一种是从 IQueryable 中获取虚拟行数,这样可以按预期返回计数
- 第二个是未更改的 300k 查询,我不知道为什么会发生这种情况
- 第三个是带回 50 行的更改查询
由于我已经覆盖了 OnDataBinding 方法,我不知道它还会从哪里提取这些数据,因为 DataSource 在 OnDataBinding 结束之前更新,然后具有更改后的 IQueryable。因此,当我不想要它时,它会在Telerik Land 中做一些事情来获取这些数据,为什么要进行大量查询来获取所有数据,然后稍后再查询最小数量?没有意义...
【问题讨论】:
标签: c# webforms telerik lazy-loading radgrid