我想在MVC中对大量数据(DB有2-3百万条记录)实施分页,搜索,排序。在MVC中使用默认分页选项(使用PagedList.Mvc
,@Html.PagedListPager
)时,将获取所有记录以用于DB&页面上只显示100条记录。这很耗时&使用了更多的记忆。
如何在MVC中实现自定义逻辑,每页只检索100条记录?目前我正在尝试这两种方法(使用EF和SP)。
我已经使用EF& amp;已经开发了示例应用程序。 SP并实现默认分页。但是这两种方法都从DB&中检索所有记录。然后在客户端应用分页。这太费时了。
public ActionResult Index(int? page) {
return View(db.TestUploadData2.ToList().ToPagedList(page ?? 1, 100));
}
有什么建议吗?
答案 0 :(得分:3)
您遇到的问题是,您要将数据库中的所有内容都拉到C#内存中,然后然后只获取您想要显示的内容。
db.TestUploadData2.ToList()
.ToList()
是从数据库中提取的内容,因此您希望在此之前提取您的资格。
这样的事情应该是你需要做的事情:
public IEnumerable<TestUploadData2> GetPagedData(string prop1SearchValue,
string prop2SearchValue,
int pageNum = 1,
int pageSize = 20)
{
var data = db.TestUploadData2;
// No idea what your properties are, so I'll just wing with strings.
if (!string.IsNullOrWhitespace(prop1SearchValue))
{
data = data.Where(d => d.Prop1 == prop1SearchValue);
}
// Did it like this so you can see how to conditionally filter the query
if (!string.IsNullOrWhitespace(prop2SearchValue))
{
data = data.Where(d => d.Prop2 == prop2SearchValue);
}
// If it is the first page, then 0 * pageSize,
// second page, skip 1 * pageSize, etc.
return data.Skip((pageNum - 1) * pageSize)
// Take only what is being asked for.
.Take(pageSize)
// NOW pull it from the database.
.ToList();
}
答案 1 :(得分:3)
以下是使用PagedList.Mvc
的正确方法。
public ViewResult Index(int? page)
{
int pageSize = 100;
int pageNumber = (page ?? 1);
return View(db.TestUploadData2.ToPagedList(pageNumber, pageSize));
}
您可以在Paging with the Entity Framework文章中详细了解此信息。