2009-10-25 41 views
2

我正在使用返回產品列表的Web服務。我以編程方式創建了一個網格視圖,並使用該列表作爲數據源。但是,我不能使用Paging/Sorting方法,因爲它導致錯誤,因爲我沒有使用ObjectSource控件。我手動處理分頁和排序,但我不知道我是否有效地進行分頁。 當用戶點擊了新的一頁,我處理頁面的索引改變這樣的:我的gridview分頁/排序效率低下嗎?

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 

    userProducts = Data.GetProductList(); 

    this.gvProductList.PageIndex = e.NewPageIndex; 
    this.gvProductList.DataSource = userProducts; 
    gvProductList.DataBind(); 
} 

但是,當我改變頁面的數據庫總是被調用。有沒有辦法讓這更有效率,或者是尋常的正常?排序也是如此,它使用Web服務獲取產品,然後使用lambda表達式根據各個列對產品進行排序。每次發生這種情況時,都會調用數據庫(以便再次獲取產品列表)。我是否錯誤地處理了這個問題?我知道我可以使用會話等來存儲列表,但每個列表中可以有數百個自定義對象,在任何時候都可以有數以萬計的用戶。

我應該注意到,Web服務是由第三方提供的(所以它的數據庫被調用),這意味着我將無法訪問SQL Server本身,也無法訪問任何更改Web服務的方法。

感謝您的任何幫助。

編輯:我應該提到產品列表是用戶的購物車。因此,每個用戶都是獨一無二的。

一致意見:如果購物車沒有多個物品,那麼當前的方法就沒問題。但是,如果需要緩存,則可以通過使用In Proc會話或將會話存儲在SQL Server上來實現。

回答

2

不,這不是有效的,因爲你正在帶回底層數據庫中的每條記錄(假定GetProductList()返回所有記錄)。 GridView分頁意味着它只顯示給定PageIndex的PageSize中定義的行數 - 但它並不影響從數據源實際返回的記錄數量。

不幸的是,由於您無法直接訪問數據庫,並且Web服務不提供任何其他方法,因此您可以做的最好的方法是cache the data。幸運的是,asp.net製作了cacheing data quite simple。 Cache對象與Session類似,除了每個應用程序只有一個實例,而不是每個用戶。

+0

我想過使用緩存,但產品列表不是通用的。它基本上是用戶的購物車,因此它對每個用戶都是唯一的。 – keyboardP 2009-10-25 18:31:44

+0

在這種情況下,我不會擔心 - 我懷疑任何人都會在購物籃中放置很多產品。如果你真的想緩存結果,你可以使用Session。如果您擔心內存,請記住您可以將會話狀態存儲在SQL Server中。 – 2009-10-25 19:34:36

+0

感謝您的幫助丹。平均而言,每個籃子將會有大約60件物品。我會一步一步地做事。如果第三方服務器上的點擊次數過多,我將在proc會話中使用。如果這證明內存密集,我將使用SQL Server會話。謝謝! – keyboardP 2009-10-25 19:51:57

1

它看起來像是從Web服務中獲取所有產品,然後從網頁中進行排序和分頁。這意味着您從任何時候都需要比Web服務更多的數據。 Web服務是否提供了傳遞代表所需頁面,頁面大小和排序順序的參數的功能?如果沒有,也許你應該討論向提供服務的第三方添加這些功能的可能性。

如果這是不可能的,產品列表多久更新一次?如果更新頻率較低,則可以使用ASP.NET緩存在本地存儲Web服務調用的結果。緩存的數據源可以設置爲每小時過期。這樣,查看該頁面的用戶將看到一個合理的最新產品列表。

+0

我已經聯繫了第三方,看看是否有可能。如果是這樣,它是否僅僅是傳遞相關參數的一種情況(比如每頁的項目數量等)?或者我必須完全改變我的方法嗎?] 產品列表實際上是用戶的購物車。因此,只有在手動更新時纔會更新。 – keyboardP 2009-10-25 18:28:42

+0

@TenaciousImpy:任何時候用戶的購物車中可能有多少物品?如果我們只談論單/雙數字,你現在的方法可能就足夠了。對服務中的結果進行排序和分頁可能會矯枉過正。爲了避免在每次更改頁面時獲取購物車的內容,可以在第一次加載頁面時將購物車的內容緩存在ASP.NET會話中。會話狀態是每個用戶,而不是每個應用程序,因此每個用戶都將獲得他們自己的會話狀態。 – pmarflee 2009-10-25 19:20:48

+0

@pmarflee - 感謝您的幫助。我猜測每個用戶會有大約60個左右的項目。如果第三方獲得太多不必要的點擊,我可以訴諸會議。現在,我會保持原樣。 – keyboardP 2009-10-25 19:49:58