2

ASP.NET MVC3 に基づく書籍管理システム Web アプリケーションがあります。書籍のインデックス ページをクリックすると、データ クエリが非常に遅くなり、ユーザーは応答を数秒待たなければなりません。以下の BookController の Action Index のコード:

    public ViewResult Index(string sortOrder, int? page)
    {
        ViewBag.NameSortParam = string.IsNullOrEmpty(sortOrder) ? "desc" : "";
        ViewBag.CurrentSort = sortOrder;

        BookModel books = from b in db.Books select b; // db = new BookContext();
        switch (sortOrder) {
            case "desc":
                books = books.OrderByDescending(b => b.Name);
                break;
            default:
                books = books.OrderBy(b => b.Name);
                break;
        }
        int pageSize = 15;
        int pageNumber = (page ?? 1);

        return View(books.ToPagedList(pageNumber, pageSize));
    }

私の意見では、遅い主な理由は、すべてのデータの準備が整うまでサーバーがクライアントに応答しないことです。このプロセスには多くの時間がかかります。

この問題を解決する方法がわかりません。この場合、データ クエリのパフォーマンスを向上させる方法はありますか? ありがとうございました!

更新: バックエンド データベースは SQL Server Compact Edition 4.0 です

UPDATE 以下のロジック コードを更新し、 andステートメントのorderby前に使用します。すべてがうまくいきます。助けてくれてありがとう。skiptake

books = (from b in db.Books
                       orderby b.Name descending
                       select b)
                       .Skip((page - 1) * pageSize)
                       .Take(pageSize)
                       .ToList();
4

3 に答える 3

3

( を使用して) 必要なデータだけにデータセットをフィルター処理する前に、すべてのブックを読み込んでいますToPagedList。クエリを変更し、 の代わりに メソッドSkipとメソッドを使用してください。TakeToPagedList

于 2012-08-20T08:11:07.127 に答える
0

Books.Name 列にインデックスを付けます (含まれる列: リストに必要なものを含めます)。C# 側のクエリでは、必要なフィールドのみを指定します。

books.Select(x => new {
                       x.Name,
                       x.Author,
                       x.Description,
                       x.ID }).ToPagedList(/*....*/)./*...*/)

そして、私は ToPagedList 実装の世話をします。

于 2012-08-20T08:10:50.093 に答える
0

メソッドで OutputCaching を使用し、2 つのパラメーターによって変化させます。この概要については、こちらで詳しく説明しています

[OutputCache(Duration=60,VaryByParam="sortOrder;page;")]
public ViewResult Index(string sortOrder, int? page)
于 2012-08-20T08:35:01.770 に答える