2

現在、テレリックがページング、並べ替え、フィルタリングなどを制御できるようにするページでテレリック radgrid (Web フォーム) が使用されているシナリオがあります。メモリなので、何も遅延ロードされません。

この例では、300,000 行 (ある時点で 120 万行) を超える行が返される状況があり、これはページング、ソートなどのたびに再クエリを実行するようで、非常に遅いです。

現在、db のやり取りは linq から sql を介して行われているため、これらの懸念をサーバー側にプッシュしたいので、ベース (300k クエリ) を使用する代わりに、構成可能な IQueryable を取得して、フィルタリング、並べ替え、ページングを追加したいと考えています。データはすべてそこにあるように見えるので、必要なデータのみを取得するように強制するために、コントロールのデータバインディングをいつインターセプトする必要があるかわかりません。

私の現在の調査からOnSortCommand、ソートが要求されたときにトリガーされるように見えるメソッドがあるので、そこから取得SortExpressionしてlinqクエリに入れることができると仮定しFilterExpression、結果を制約するために使用できるもあります最後にPageSizeandCurrentPageIndex変数があります。これらの変数を使用して、戻す必要があるページ数を計算できます。

したがって、クエリを制約するために必要なすべてのデータがそこに存在しますが、フィルター式とページングの詳細を考慮してをインターセプトOnDataBindingしてオーバーライドする場合、現在のようにバインドプロセスをいつインターセプトする必要があるかわかりません (ソートはまで利用できないため)DataSource私の知る限りソートコマンド)、50行(またはページサイズが何であれ)をプルバックするクエリのみがあると予想されますが、300kクエリを実行し、その後50行クエリを実行するようです。別のイベントまたはメソッドをインターセプトする必要があるかどうかについて混乱しています。

誰かが私がインターセプト/オーバーライドすべき方向に私を向けることができれば、私は非常に感謝しています。

== 編集 ==

シナリオについてもう少し具体的に言うと、再利用可能なコンポーネントである必要があるため、データソース (高度なデータバインディング) を内部的に作成したくないので、コントロールは aspx ページで作成され、次にコードビハインドで作成されます。ページの読み込み時に、クエリを説明する IQueryable オブジェクト (300k オブジェクト) を設定し、この継承されたコントロール内で、、、およびを使用してクエリに追加DataSourceできるようにしたいと考えています。したがって、データ ソースはこのクラスの外部に提供されます。filterexpressionsortexpressionpagesizepageindex

==編集2 ==

私の混乱の核心にもっと注意を引くために、現在私にとって最も不可解なことの1つは、グリッドが3つのクエリを実行しているという事実です。

  • 1 つは、IQueryable から仮想行数を取得することです。これは問題なく、期待どおりの数を返します。
  • 2 つ目は変更されていない 300k クエリです。なぜこれが発生しているのかわかりません
  • 3 番目は、50 行を戻す変更されたクエリです。

メソッドをオーバーライドしたOnDataBindingので、このデータを他にどこから取得するのかわかりません。 がDataSource終了する前に更新され、OnDataBindingIQueryable が変更されるためです。したがって、ある時点で、Telerik Land必要のないときにこのデータをフェッチするために何かを行っています.なぜすべてのデータを取得するために巨大なクエリを実行し、後で最小限の量をクエリするだけなのでしょうか? 意味がありません...

4

1 に答える 1