0

說我想添加分頁支持。 我的應用程序在Web,服務和存儲庫中分開。幫助IQueryables和lazyLoading在asp.net mvc

控制器只與服務對話,服務獲取數據並執行業務邏輯。

說我要支持分頁..我有這個方法在我ContributorService

public IQueryable<Contributor> GetContributors(int page, int pageSize) 
     { 
      return _repository.GetAll().OrderBy(c=>c.ACC_CREATEDATE).Skip((page)*pageSize).Take(pageSize);//solo temporalmente 
     } 

是OK?還是應該在存儲庫中完成OrderBy,Skip,Take?

目前唯一做到這一點

public IQueryable<Contributor> GetAll() 
     { 
      return db.Contributors; 
     } 
+3

無論哪種方式,它沒有區別,因爲只有當「.ToList()」在IQueryable上調用,或者訪問集合中的第一個元素。可以通過LinqToSqlProfiler進行確認。 – 2011-02-07 04:48:38

回答

0

我想查詢添加到業務對象(我想你沒有一個,你),但你可能有它的基礎版本,另一個爲分頁數據。並期望服務通過調用ToList來執行該查詢,我發現將查詢對象返回給控制器是危險的。

您的存儲庫可能有一個GetPartial方法,包括排序,從,到和過濾參數。如果你有一個通用服務,你也可以在這個通用服務中實現它。

public List<Contributor> GetPartial<TSortBy>(Expression<Func<Contributor, TSortBy>> sortByExpr, Expression<Func<Contributor, bool>> filterExpr, int pageNo, int pageSize) 
     { 
      var query = db.Contributors; 
      if (filterExpr != null) 
        query.Where(filterExpr); 
query.orderBy(sortByExpr).Skip (...).Take(...).ToList(); 

     } 

如果您有一個存儲庫類,則可以添加此方法。 順便說一句,我使用的動態LINQ,這使得它更容易通過表達式傳遞順序作爲純文本(就像sql)