2011-06-20 47 views
8

我首先在代碼中使用EF4,並有一個持久性存儲庫和一個與其交互的服務層。我有一個服務層方法,在我的資源庫上調用一個IQueryable方法,並返回一個包含實體的IEnumerable。我還需要返回總記錄數,以便計算分頁鏈接。如何從我的服務層方法公開總記錄數和IEnumable分頁記錄集合?

如何從我的服務方法返回int和IEnumerable?

  • 使用out參數上總行的方法計數
  • 創建一個單獨的類,其包括總的行數作爲屬性
  • 移動尋呼LINQ查詢出服務層(暴露出IQueryable來自服務層上的回購)
  • 在服務層上創建一個完全獨立的方法,該方法爲count執行新的查詢。

所有這些都應該工作,但哪一個最清潔?

更新:這是一些體系結構的說明。如果這是錯誤的,那麼請告訴我更好的方法(例如 - 做在表示層,而不是服務層分頁等)

回購層:

回報DbSet的IQueryable的,抽象的DB訪問從表現層

服務層:

並在IQueryable的LINQ查詢過濾和剛剛得到的頁面項目爲使用跳過和採取必要和返回的IEnumerable(打算也設定爲名單上返回,以避免任何的DbContext壽命問題)

表示層:

調用服務層上的方法(getPagedResults(過濾器,PAGENUMBER,pageSize的))

從外觀上來看我也會需要添加一個單獨的方法來獲得總體結果。希望能夠在一個電話中完成這一切。

我不想將所有記錄帶回演示文稿,然後頁面...似乎效率低下。

+0

如果你已經返回'IEnumerable '是否有一些特定的原因,你不只是在'IEnumerable'上使用'.Count()'?你只是提出了前端的子集?前端不應該負責分頁嗎? – AllenG

+0

您返回的IEnumerable是否包含所有項目? (與count相同數量的項會返回) – Magnus

+0

@AllenG - 我在服務層本身進行分頁,然後向UI/Codebehind使用者返回一個列表。這樣我可以避免任何與我的Dbcontext生存期有關的問題。另外,我不必將所有記錄發送到前端,然後執行分頁......將直接在服務層查詢中獲取我需要的記錄。 – jpshook

回答

7

你可以做這樣的事情

public class Repository<TEntity> 
{ 
    public IEnumerable<TEntity> GetCollection(Expression<Func<TEntity, bool>> filter, 
     int pageSize, int pageIndex) 
    { 
     return YourDbSet.Where(filter).OrderBy(sortExpression).Skip(pageSize * pageIndex).Take(pageSize); 
    } 

    public int Count(Expression<Func<TEntity, bool>> filter) 
    { 
     return YourDbSet.Where(filter).Count(); 
    } 
} 

然後你可以寫一個擴展方法使用這些方法

public static Pagination<TEntity> GetPagination<TEntity>(this Repository<TEntity> repository, 
    Expression<Func<TEntity, bool>> filter, int pageSize, int pageIndex) 
{ 
    var entities = repository.GetCollection(filter, pageSize, pageIndex); 
    var count = repository.Count(filter); 

    return new Pagination(entities, pageSize, pageIndex + 1, count); 
} 

這種方式可以單獨重用GetCollectionCount方法兩者。 您可以動態構建where條件。看看我的answer

+0

我仍然在學習,所以試圖堅持具體的實現,直到我對仿製藥領先。 – jpshook

+0

@Developr由於您正在使用IQueryable,因此您已經在使用泛型。通用參數由編譯器推斷。所以你不必給他們 – Eranga

+0

這裏是一個鏈接到另一個問題,顯示我的架構...非常簡單和具體:http://stackoverflow.com/questions/6416506/which-types-should-my-entity -framework的存儲庫和服務層的方法-retur – jpshook

1

如果你正在返回的Enumerable包含所有的項目,我會做一個ToList()它之前,如果從函數返回。 (然後你可以做Count而沒有費用) 如果函數返回一個子集合(使用Skiptake)我會添加一個單獨的函數來獲得總數。