2009-04-12 18 views
12

WCFサービスとそのASP.NET MVCクライアントを含むアプリケーションを開発しています。 ASP.NET MVCのWebサイトには、製品のグリッド、たとえば製品が表示されている必要があります。これらの製品は、WCFサービスを通じてアクセス可能なデータベースに格納されています。そこでMVCコントローラのどこかでWCFサービスのメソッドを呼び出して、表示する必要がある製品の配列を返します。WCFサービスによるページャの実装

私の質問は何ですか?多くの製品が存在する可能性があるため、製品グリッド用のポケットベル機能を実装したいと考えています。だから、それを行うには、いくつかの方法があります。

  1. 私のコントローラは、製品の全体のリストを取得し、ちょうど行うことができますメモリ内のページングが
  2. WCFは、すべての製品を選択して、どこかにそのキャッシュに保存し、その後、渡すことができます要求されたページ番号に従って、コントローラのうちの一部のみに送信する。
  3. WCFは、要求されたページ番号に従って、データベースから製品の一部のみを選択できます。
  4. WCFはIQueryableをコントローラに返すことができ、コントローラは必要なときにいつでも必要なものを選択します。

私が理解する限り(真実でない場合は私を修正します)、最初のオプションは役に立たないので、他のものの中から選択する必要があります。

2番目のオプションは、サーバーのメモリを無駄にします。

3番目のオプションはOKですが、WCF側でページングを実装するのはちょっと醜いようです。

そして、4番目のオプションは混乱を招きます。私は実際に何らかのクエリをクライアントに渡し、WCFサービスを通じて自分でデータベースにクエリを実行します。私はこれを正しく実装する方法を理解できません。

これを実装する正しい方法を選択するのを手伝ってもらえますか?

答えて

15

バックエンドデータベースのレイヤーはどのようになっていますか? LINQ(-to-SQLまたは-to-Entities)を使用している場合は、ページサイズとページ番号を指定してWCFでページングを実装し、LINQの「Skip」および「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を使用しています。だからあなたが提供しているものは、実際に私の3番目の選択肢です。さて、私はおそらくそれを行くでしょう。私は、WCFサービスがIQueryable を実際にdbから何も選択せずにクライアントに渡すときに、何らかの怠惰な実行について考えました。しかし、私はそれを行う方法を理解することができません –

+0

今、現在の製品では、IQueryableを回すことはやりにくいかもしれないと思います。しかし、MIX'09ビデオを「RIA Services」でチェックしてみると、これはMSが現在Silverlight 3用に構築しているもので、おそらくすべての問題を解決します:-) –

関連する問題