2014-07-20 24 views
0

我有大約14,000行數據。如果使用以下EF查詢,需要很長時間才能加載,因爲我懷疑它正在加載所有14,000行,只有這樣才能完成所有額外的過濾。這是我的存儲庫中的Select方法。如何優化此EF查詢並實現分頁?

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擴展來獲得分頁功能。一切都很好,只要我只有幾百條記錄。那麼該怎麼辦?大部分(如果不是全部)分頁的例子,我可以發現使用特洛伊的庫包含直接在控制器中的所有代碼。

+0

創建日期時是否存在某種索引,以便SQL Server可以高效地找到第一個X記錄?你應該返回一個IQueryable –

回答

1

調用ToList執行查詢,正如您所說,它獲取每條記錄。尋呼使用SkipTake,例如,

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

源列表可以是表本身或WhereOrderBy電話或任何的結果。只要確保ToList或最好是ToArray被稱爲最後一個。

+0

如何將pageSize和PageNumber從視圖/控制器傳入存儲庫? –

+0

你將如何傳遞過濾器值?你也是這樣做的。 – jmcilhinney

+0

我得到它的工作。跳過和採取正常工作。現在只是遇到尋呼助手渲染的麻煩。 –