2009-04-12 147 views
12

我正在開發一個包含WCF服務及其ASP.NET MVC客戶端的應用程序。 ASP.NET MVC網站必須顯示一個對象網格 - 比如產品。這些產品存儲在可通過WCF服務訪問的數據庫中。因此,在MVC控制器內的某個地方,我稱之爲WCF服務的方法,它返回我需要顯示的一系列產品。通過WCF服務實現尋呼機

那麼我的問題是什麼?我想爲我的產品網格實現尋呼機功能,因爲可能會有很多產品。因此,有幾種方法可以做到這一點:

  1. 我的控制器可以得到產品的完整列表,只是做內存分頁
  2. WCF可以選擇所有產品,它們在高速緩存中存儲一​​些,然後通過根據請求的頁碼向控制器提供其中的一部分。
  3. 根據請求的頁碼,WCF只能從數據庫中選擇部分產品。
  4. WCF可以將IQueryable返回給控制器,然後控制器將隨時選擇他想要的任何內容。

據我瞭解(並糾正我,如果它不是真的),第一個選項是無用的,所以我必須在其他人之間進行選擇。

第二個選項浪費我的服務器的內存。

第三個選項是確定的,但在WCF端實現分頁似乎有點難看。

而第四個選項聽起來很混亂。實際上,我將某種查詢傳遞給客戶端,然後他通過WCF服務自己查詢我的數據庫。我無法弄清楚如何正確實施。

那麼你能幫我選擇正確的方法來實現這一點嗎?

回答

15

你的後端數據庫層是什麼樣的?如果您使用的是LINQ(對SQL或對實體),您可以通過指定頁面大小和頁碼來實現通過WCF進行分頁,然後使用LINQ的「跳過」和「Take」運算符來獲取請求的網頁 - 這大致是:

[ServiceContract] 
public interface IFetchData 
{ 
    [OperationContract] 
    public List<Data> GetData(int pageSize, int pageNumber) 
} 

,然後實現它像這樣(簡化):

public class FetchDataService : IFetchData 
{ 
    public List<Data> GetData(int pageSize, int pageNumber) 
    { 
     var query = yourContext.DataTable 
        .Skip((pageNumber - 1) * pageSize) 
        .Take(pageSize); 

     return query.ToList(); 
    } 
} 

請問這是否對你有幫助?

Marc

+0

是的,我正在使用LINQ-to-SQL。所以你提供的是我的第三個選擇。那麼,我可能會去做。我想到了一些懶惰的執行,當WCF服務將IQueryable 傳遞給客戶端時,實際上並未從數據庫中選擇任何內容。但我不知道如何去做 – 2009-04-12 19:40:15