如何提高ASP.NET MVC3应用程序数据查询性能?

时间:2012-08-20 07:59:00

标签: asp.net asp.net-mvc-3 entity-framework linq-to-sql

有一个基于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

更新 我在下面更新了我的逻辑代码,在orderbyskip语句之前使用了take。一切顺利。谢谢大家的帮助。

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

3 个答案:

答案 0 :(得分:3)

在将数据集过滤到您需要的数据之前(使用ToPagedList),您正在加载所有图书。更改您的查询并使用SkipTake方法代替ToPagedList

答案 1 :(得分:0)

在Books.Name列上放置索引(包含列:包括列表中需要的列),在C#端查询仅提供您需要的文件:

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

我会照看ToPagedList实现。

答案 2 :(得分:0)

对方法使用OutputCaching,因两个参数而异。对此的概述是detailed here

[OutputCache(Duration=60,VaryByParam="sortOrder;page;")]
public ViewResult Index(string sortOrder, int? page)