我有大约14,000行数据。如果使用以下EF查询,则需要很长时间才能加载,因为我怀疑它正在加载所有14,000行,然后才进行任何额外的过滤。这是我的存储库中的Select方法。
Public Function SelectAll() As IEnumerable(Of be_Posts) Implements IPostRepository.SelectAll
Dim posts As IEnumerable(Of be_Posts)
Using db As Ctx = New Ctx
posts = db.be_Posts.OrderByDescending(Function(x) x.DateCreated).ToList
Return posts
End Using
和控制器:
Function Index(page As Integer?) As ActionResult
Dim PageSize = System.Web.Configuration.WebConfigurationManager.AppSettings("PageSize")
Dim pageNumber As Integer = If(page, 1)
Dim posts = _repo.SelectAll()
Return View(posts.ToPagedList(pageNumber, PageSize))
End Function
视图中的助手:
@Html.PagedListPager((Model), Function(page) Url.Action("Index", New With { _
.page = page _
}), PagedListRenderOptions.ClassicPlusFirstAndLast)
现在如果添加一个take
子句,例如.Take(500)
,那么事情就会快得多。如何更快地进行此查询并仍然可以处理所有记录?我还使用Troy Goode的PagedList扩展来获取分页功能。只要我得到几百条记录,一切都很好。那么该怎么办?大多数(如果不是全部)我可以找到使用Troy库的分页示例直接涉及控制器中的所有代码。
答案 0 :(得分:1)
调用ToList
执行查询,正如您所说,它正在获取每条记录。使用Skip
和Take
进行分页,例如
Dim page = list.Skip(pageSize * (pageNumber - 1)).Take(pageSize)
源列表可以是表本身,也可以是Where
或OrderBy
调用的结果。只需确保最后调用ToList
或最好是ToArray
。