2010-05-04 43 views
1

返回總項目數的最佳方式,我們已經得到了以下信息庫方法什麼是從倉庫getitems方法

public IList<Foo> GetItems(int fooId, int pageIndex, int pageSize 
, string sortField, string sortDir, out int totalItems) 
{ 
// Some code 
} 

我的問題是:它是確定以這種方式使用out。我對out感到有些不舒服,但不能想出一個更好的方式來將它寫成單個呼叫。

+0

爲什麼客戶端不能查詢IList.Count來檢索總項目? – Gishu 2010-05-04 14:38:35

+0

IList.Count不會返回總數。 IList.Count = pageSize,這是已知的。 – John 2010-05-04 15:19:22

回答

1

我找到了我正在尋找的答案,但不是來自評論。謝謝你,雖然你的幫助。

事實證明,MVC大師Rob Conery在一段時間之前發佈的關於使用PagedList的內容。這是一個優雅的模式,根據博客,ScottGu已經在演示中使用它。基本上,而不是使用IList<T>List<T>,您使用IPagedList<T>PagedList<T>PagedList<T>: List<T>, IPagedList<T>.

public interface IPagedList 
{ 
    int TotalCount { get; set; } 
    int PageIndex { get; set; } 
    int PageSize { get; set; } 
    bool IsPreviousPage { get; } 
    bool IsNextPage { get; } 
} 

還有更多的代碼,所以請查看Rob的博客。

http://blog.wekeroad.com/blog/aspnet-mvc-pagedlistt/

+0

關於這一點,我真的很喜歡它,它包含的不僅僅是計數,還可以很容易地添加我自己的其他屬性和方法,這可以幫助保持客戶端代碼更清晰。所以列表對象本身包含哪些字段按照方向排序。可以添加一個屬性字符串[] TopPageIndeces,這對創建分頁超鏈接很有用。 – John 2010-05-05 17:07:24

0

我不明白你爲什麼想在一次通話中做到這一點。如果您需要優化單獨的總計數調用的存儲庫往返傳輸,我相信您過早地進行了微優化,除非您已經測量出此特定調用是您的性能問題。如果你已經測量過它,我估計你的存儲庫有更大的問題。

我個人會堅持一個簡單的Count屬性上面公開GetItems相同的對象。

更新:爲了解決你的問題是沒有理由不把它設計爲一​​個單一的電話:

它讓你的API更復雜,比它需要更加模糊。 GetItems()主要意圖(如上所述)是處理單頁的項目;添加out參數用於語義重載的項目總數。

以下是需要考慮的事項 - 如果我只關心物品的總數,是否需要撥打GetItems或者是否有單獨的方法?如果有一個單獨的方法,爲什麼有兩種方式來訪問相同的信息,並有可能返回不同的結果?如果沒有單獨的結果,爲什麼我必須獲取整頁記錄才能獲取存儲庫中項目的總數?

+0

有沒有很好的理由不把它作爲一個單一的電話? – John 2010-05-04 15:32:20

+0

不同意,我都是爲了避免過早優化,但不必要的往返總是會影響性能相對較早。 – eglasius 2010-05-04 19:03:47

+0

@Freddy Rios - 不知道存儲庫是如何實現的,你不能聲稱在同一個暴露GetItems的對象上有一個單獨的Count屬性會導致往返。 – 2010-05-04 20:32:57

1

這是怎麼回事?

public class ItemsList 
{ 
    public IList<Foo> Items { get; set; } 
    public int TotalCount { get; set; } 
} 

public ItemsList GetItems(int fooId, int pageIndex, int pageSize, string sortField, string sortDir) 
{ 
    return new ItemsList { Items = ..., TotalCount = ... }; 
} 

您也可以存儲其他信息。

public class ItemsList 
{ 
    public IList<Foo> Items { get; set; } 
    public int TotalCount { get; set; } 
    public string SortField { get; set; } 
    public string SortDirection { get; set; } 
    public int PageIndex { get; set; } 
    public int PageSize { get; set; } 
} 

甚至創建一個泛型類。

+0

創建泛型類有任何問題嗎? – John 2010-05-04 15:38:27