質問

製品のリストを返す Web サービスを使用しています。プログラムでグリッド ビューを作成し、リストをデータソースとして使用しました。ただし、ObjectSource コントロールを使用していないため、エラーが発生するため、ページング/ソート メソッドは使用できません。ページングと並べ替えを手動で処理しましたが、効率的に実行できているかどうかはわかりません。ユーザーが新しいページをクリックすると、ページ インデックスの変更を次のように処理します。

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

    this.gvProductList.PageIndex = e.NewPageIndex;
    this.gvProductList.DataSource = userProducts;
    gvProductList.DataBind();
}

ただし、ページを変更するとデータベースが常に呼び出されます。これをより効率的にする方法はありますか、それともページングでは通常のことですか?並べ替えについても同様で、Web サービスを使用して製品を取得し、ラムダ式を使用してさまざまな列に従って製品を並べ替えます。これが発生するたびに、(製品のリストを再度取得するために) データベースが呼び出されます。私の扱い方が間違っているのでしょうか?セッションなどを使用してリストを保存できることはわかっていますが、リストごとに数百のカスタム オブジェクトが存在し、一度に数万のユーザーが存在する可能性があります。

Web サービスはサードパーティによって提供されている (つまり、そのデータベースが呼び出されている) ことに注意してください。つまり、SQL Server 自体にアクセスすることも、Web サービスを変更する方法も持たないことを意味します。

助けていただきありがとうございます。

編集:製品リストはユーザーのショッピングカートであることに注意してください。したがって、ユーザーごとに一意です。

一般的なコンセンサス: ショッピングカートにあまり商品が入っていない場合は、現在の方法で問題ありません。ただし、キャッシュが必要な場合は、In Proc セッションを使用するか、SQL Server にセッションを保存することで実現できます。

役に立ちましたか?

解決

いいえ、基になるデータベース内のすべてのレコードを戻すことになるため、効率的ではありません (GetProductList() がすべてのレコードを返すと仮定しています)。GridView ページングは​​、指定された PageIndex の PageSize で定義された行数のみを表示することを意味しますが、データソースから実際に返されるレコードの数には影響しません。

残念ながら、データベースに直接アクセスできず、Web サービスは他の方法を提供していないため、おそらくできる最善の方法は次のとおりです。 データをキャッシュする. 。幸いなことに、asp.net は データのキャッシュは非常に簡単です. 。Cache オブジェクトは Session に似ていますが、ユーザーごとではなくアプリケーションごとに 1 つのインスタンスしか持たない点が異なります。

他のヒント

すべての製品をWebサービスから取得し、Webページ内からソートとページングを実行しているようです。つまり、一度に必要なデータよりも多くのデータをWebサービスからプルバックしているということです。 Webサービスは、必要なページ、ページサイズ、ソート順を表す引数を渡す機能を提供しますか?そうでない場合は、サービスを提供しているサードパーティとこれらの機能を追加する可能性について話し合う必要があります。

これが不可能な場合、製品リストはどれくらいの頻度で更新されますか?更新頻度が比較的低い場合は、ASP.NETキャッシュを使用して、Webサービス呼び出しの結果をローカルに保存できます。キャッシュされたデータソースは、たとえば1時間ごとに期限切れになるように設定できます。このようにして、ページを表示しているユーザーには、合理的に最新の製品リストが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top