如何优化这个EF查询并实现分页?

问题描述 投票:0回答:1

我有大约 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 库的分页示例都直接涉及控制器中的所有代码。

vb.net pagination entity-framework-6 asp.net-mvc-5.1
1个回答
1
投票

调用

ToList
执行查询,正如您所说,它会获取每条记录。 使用
Skip
Take
完成分页,例如

Dim page = list.Skip(pageSize * (pageNumber - 1)).Take(pageSize)

源列表可以是表本身,也可以是

Where
OrderBy
调用的结果或其他。 只需确保最后调用
ToList
,或者最好是
ToArray

© www.soinside.com 2019 - 2024. All rights reserved.