現在、テレリックがページング、並べ替え、フィルタリングなどを制御できるようにするページでテレリック radgrid (Web フォーム) が使用されているシナリオがあります。メモリなので、何も遅延ロードされません。
この例では、300,000 行 (ある時点で 120 万行) を超える行が返される状況があり、これはページング、ソートなどのたびに再クエリを実行するようで、非常に遅いです。
現在、db のやり取りは linq から sql を介して行われているため、これらの懸念をサーバー側にプッシュしたいので、ベース (300k クエリ) を使用する代わりに、構成可能な IQueryable を取得して、フィルタリング、並べ替え、ページングを追加したいと考えています。データはすべてそこにあるように見えるので、必要なデータのみを取得するように強制するために、コントロールのデータバインディングをいつインターセプトする必要があるかわかりません。
私の現在の調査からOnSortCommand
、ソートが要求されたときにトリガーされるように見えるメソッドがあるので、そこから取得SortExpression
してlinqクエリに入れることができると仮定しFilterExpression
、結果を制約するために使用できるもあります最後にPageSize
andCurrentPageIndex
変数があります。これらの変数を使用して、戻す必要があるページ数を計算できます。
したがって、クエリを制約するために必要なすべてのデータがそこに存在しますが、フィルター式とページングの詳細を考慮してをインターセプトOnDataBinding
してオーバーライドする場合、現在のようにバインドプロセスをいつインターセプトする必要があるかわかりません (ソートはまで利用できないため)DataSource
私の知る限りソートコマンド)、50行(またはページサイズが何であれ)をプルバックするクエリのみがあると予想されますが、300kクエリを実行し、その後50行クエリを実行するようです。別のイベントまたはメソッドをインターセプトする必要があるかどうかについて混乱しています。
誰かが私がインターセプト/オーバーライドすべき方向に私を向けることができれば、私は非常に感謝しています。
== 編集 ==
シナリオについてもう少し具体的に言うと、再利用可能なコンポーネントである必要があるため、データソース (高度なデータバインディング) を内部的に作成したくないので、コントロールは aspx ページで作成され、次にコードビハインドで作成されます。ページの読み込み時に、クエリを説明する IQueryable オブジェクト (300k オブジェクト) を設定し、この継承されたコントロール内で、、、およびを使用してクエリに追加DataSource
できるようにしたいと考えています。したがって、データ ソースはこのクラスの外部に提供されます。filterexpression
sortexpression
pagesize
pageindex
==編集2 ==
私の混乱の核心にもっと注意を引くために、現在私にとって最も不可解なことの1つは、グリッドが3つのクエリを実行しているという事実です。
- 1 つは、IQueryable から仮想行数を取得することです。これは問題なく、期待どおりの数を返します。
- 2 つ目は変更されていない 300k クエリです。なぜこれが発生しているのかわかりません
- 3 番目は、50 行を戻す変更されたクエリです。
メソッドをオーバーライドしたOnDataBinding
ので、このデータを他にどこから取得するのかわかりません。 がDataSource
終了する前に更新され、OnDataBinding
IQueryable が変更されるためです。したがって、ある時点で、Telerik Land
必要のないときにこのデータをフェッチするために何かを行っています.なぜすべてのデータを取得するために巨大なクエリを実行し、後で最小限の量をクエリするだけなのでしょうか? 意味がありません...