我們在哪裏將分頁和排序數據的邏輯放在一個asp.net資源庫模式項目中?分頁,排序等在存儲庫模式中進入哪裏?
它應該放在服務層還是放在控制器中並讓控制器直接調用存儲庫?對於jQuery網格,控制器 - >存儲庫顯示爲here。
但不像那篇文章中,我的倉庫返回IQueryable<datatype>
我們在哪裏將分頁和排序數據的邏輯放在一個asp.net資源庫模式項目中?分頁,排序等在存儲庫模式中進入哪裏?
它應該放在服務層還是放在控制器中並讓控制器直接調用存儲庫?對於jQuery網格,控制器 - >存儲庫顯示爲here。
但不像那篇文章中,我的倉庫返回IQueryable<datatype>
它應該在信息庫,如果你的倉庫回報物化序列(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模式。
每次進入新頁面時,請致電您的服務以檢索所需的結果。
排序和分頁的數據功能。它應該放在存儲庫中。
所以我的存儲庫方法需要採取所有這些參數? – 2011-02-17 16:32:42
存儲庫應該返回一個'PageableResultSet',或類似的東西,它負責分頁。
我相信分頁應該放在存儲庫中。看到這個答案我張貼在另一個問題上。
Linq .Skip()和.Take()是不夠的?你可以寫一個擴展方法GetPage(int index [,int pageSize = 20])來完成它。 – Guillaume86 2011-02-17 16:51:31