2011-02-17 39 views
13

我們在哪裏將分頁和排序數據的邏輯放在一個asp.net資源庫模式項目中?分頁,排序等在存儲庫模式中進入哪裏?

它應該放在服務層還是放在控制器中並讓控制器直接調用存儲庫?對於jQuery網格,控制器 - >存儲庫顯示爲here

但不像那篇文章中,我的倉庫返回IQueryable<datatype>

+0

Linq .Skip()和.Take()是不夠的?你可以寫一個擴展方法GetPage(int index [,int pageSize = 20])來完成它。 – Guillaume86 2011-02-17 16:51:31

回答

18

它應該在信息庫,如果你的倉庫回報物化序列(ICollection<T>List<T>)等

但是,如果你回到IQueryable<T>(像我),我希望你有一個服務層調解您的控制器和存儲庫,它執行對IQueryable的查詢並將它們物化爲具體的集合。

所以,我會把分頁放在服務層。

事情是這樣的:

public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize) 
{ 
    return repository 
      .Find() 
      .Where(predicate) 
      .ToPagedList(pageNumber, pageSize); 
} 

.ToPagedList可以應用於您所需要的分頁和項目的PagedList<T>擴展方法。

有很多PagedList<T>實現那裏。我喜歡Rob Conery's one。具有您的視圖所需的屬性,因此您可以綁定到PagedList<T>並創建一個HTML助手來非常容易地渲染頁碼。任何分頁列表LINQ實現的唯一問題是Count()操作(對於記錄數)需要在服務器上完成,因此會導致2次往返。

您不希望將非實例化查詢返回給您的視圖,因爲IMO會打破MVC模式。

每次進入新頁面時,請致電您的服務以檢索所需的結果。

1

排序和分頁的數據功能。它應該放在存儲庫中。

+0

所以我的存儲庫方法需要採取所有這些參數? – 2011-02-17 16:32:42

3
  • 排序:應該在存儲庫中對大型結果集進行排序; 可能在控制器內部進行小集合(即沒有分頁)。
  • 尋呼:國際海事組織的存儲庫應該公開一種方式返回收集片(這是不完全相同的尋呼)。這意味着,應該有一種方法來要求存儲庫返回一個查詢,在索引z處開始,以及下一個y項目。然後,與特定頁面大小(或頁面索引)相關的所有內容應保存在控制器內。這樣,您可以優化數據檢索,但不會將模型耦合到特定的表示要求。
1

存儲庫應該返回一個'PageableResultSet',或類似的東西,它負責分頁。