有一个基于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
和skip
语句之前使用了take
。一切顺利。谢谢大家的帮助。
books = (from b in db.Books
orderby b.Name descending
select b)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
答案 0 :(得分:3)
在将数据集过滤到您需要的数据之前(使用ToPagedList
),您正在加载所有图书。更改您的查询并使用Skip
和Take
方法代替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)