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

更新 我在下面更新了我的逻辑代码,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)。更改您的查询并使用SkipandTake方法而不是ToPagedList.

于 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,由两个参数变化。此处详细介绍了这方面的概述。

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