【发布时间】:2018-02-06 18:29:15
【问题描述】:
我在数据库中有一个包含 10.000 条记录的表,我想使用 PagedList 对其进行分页。问题是所有记录都已加载,然后 PagedList 对它们进行分页,它变得非常慢。我想做一个真正的分页,例如将每 20 条记录返回到 10.000 并在视图中显示它们,但我做不到。
我怎么能这样做?有什么例子吗?
模型搜索
public class SearchUsuario
{
public IPagedList<ViewUsuario> lista { get; set; }
public SearchUsuario(){
lista = new List<ViewUsuario>().ToPagedList(1, 50);
}
}
Model ViewUsuario
public class ViewUsuario
{
public String nome { get; set; }
}
通用 DAO
//returns all records
public IQueryable<T> GetAll()
{
IQueryable<T> query = context.Set<T>();
return query;
}
控制器
public ActionResult view(int? page)
{
int pageNumber = page ?? 1;
int pageSize = 10;
SearchUsuario search = new SearchUsuario();
IQueryable<Usuario> lista = new UsuarioDAO().GetAll(); //returns all records
List<ViewUsuario> listaModel = new List<ViewUsuario>();
foreach(Usuario u in lista){
Debug.WriteLine(u.nome);
ViewUsuario view = new ViewUsuario();
view.nome = u.nome;
listaModel.Add(view);
}
search.lista = listaModel.ToPagedList(pageNumber, pageSize);
return View(search);
}
查看
@using PagedList.Mvc
@model SearchUsuario
....
<table id="grid" class="table table-striped table-hover" cellspacing="0">
<thead>
<tr>
<th>Nome</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Nome</th>
</tr>
</tfoot>
<tbody>
@foreach (ViewUsuario m in Model.lista){
<tr>
<td>@Html.DisplayFor(i => m.nome)</td>
</tr>
}
</tbody>
</table>
....
Pagina @Model.lista.PageNumber de @Model.lista.PageCount
@Html.PagedListPager(Model.lista, page => Url.Action("view", new{ page = page }))
【问题讨论】:
-
您需要将您的数据库查询调整为
.Skip()和.Take()。您将根据页码和页面大小计算分页值。 -
我认为你的问题出在你的
new UsuarioDAO().GetAll()句子中:如果你使用 IQueryable,你需要返回一个IQueryable而不是一个物化集合(如List或Array),你可以使用ToPagedList将搜索范围缩小到页面中所需的项目,因此如果您发布该类的代码会很有帮助 -
@Jasen 用作您的链接建议它可以工作,但在
View上不显示页面索引。例如:第 2 页、第 3 页、第 4 页...等。我需要 2 个 List 或者一个 Count 与记录数来创建这个? -
@xavvvier
UsuarioDAO.GetAll()返回一个 IQueryable,请参见:` public IQueryableGetAll(){ IQueryable query = context.Set ();返回查询; }`
标签: asp.net-mvc pagedlist