2013-04-09 9 views
7

私はORMとしてNHibernateを使用してVS 2012でWebApiプロジェクトを作成しました。私はOdataサポートを有効にしようと考えています。そこで私は、データベースのテーブルからエンティティのリストを返す単一のGetメソッドでテストコントローラを作成しました。WebApiコントローラとODATA w/Nhibernateからのサーバサイド結果の制限

すべて正常に動作し、ODataを使用して結果をフィルタリングしたり注文することができます。問題は、データベースからコントローラに返されるデータの量を制限する方法が見つからないことです。その中に何百万もの記録があります。

Queryable属性のPageSizeプロパティを使用すると、クライアントに返されるデータの量は制限されているように見えますが、DBから返されるデータの量は制限されているようです。

getメソッド内のIQueryableTake(n)を適用しようとしましたが、返される前に結果がDBから返されますが、ODataフィルタリングは中断されます。最初のn回の結果では、空のコレクションを返します。

これを達成するために$TopパラメータをODataに使用することができますが、クライアント/コンシューマに依存しないことで、数千から数百万ものレコードを不必要に持たないようにしたいと思います。私は使用するつもりはない。

また、クライアントがクエリ文字列にTopパラメータを提供しているかどうかを手動でチェックして、OData変換をクエリ可能に適用し、変換されたクエリに対してTake(n)メソッドを適用しようとしました。この手法では、ODataを通じてすべてのエンティティをフィルタリングできましたが、$Skip=nパラメータを使用すると空のコレクションが返されるため、ページネーションが壊れます。

ODataサポートを破らずにDBからフェッチした結果を確実に制限する方法はありますか?

+1

ODataとNHibernateの間のブリッジとして何を使用していますか? ODataをNHibernate IQueryableに変換する手をロールしていますか、またはライブラリを使用していますか?また、過去に私は人々が自動的にAPIを介して返されたすべての結果にTOP 1000を課し、要求されたデータの一部しか受け取っていないことを示す情報を送信し、それは次の1000の結果を返します。呼び出し元は、すべてのデータを受信するまで、指定されたURLを使用し続けます。 –

+0

ODataを使用してクエリのディレクティを作成するのではなく、クライアントが既存のメソッドから返された結果をフィルタリングするための便利なツールとして使用します。例えば、私はNHibernateにLinqを使ってクエリーを実行するGetAllProducts()メソッドを持っていて、そのIQueryableを返します。あなたが記述する振る舞いは、Queryable属性でPageSizeプロパティを使うときのデフォルトの振る舞いですが、私の投稿で言及したように、これはクライアントが受け取るものだけを制限しますが、DBから私のサービスメソッドにフェッチされる結果は制限しません。 – andyroschy

答えて

2

最近わかったことは、次のページリンクを生成するかどうかを判断する必要があるため、サーバー駆動ページングが有効になっているときにTake(pageSize)を適用していません。エンティティのpageSize数の結果セットを列挙し、エンティティが存在するかどうかをチェックします。私は、IQueryableは一般的には怠惰な実装なので、ほとんどのプロバイダは一般的に結果の一部分を持っていると考えました。それは本当ではないことが分かります。また、結果のpageSize数だけが必要であることがわかっている場合、データベースはクエリを最適化できます。

Thisは、そのために開かれた問題です。良いニュースはYoussefが既にそれを修正したことです:)。これはそれを修正したcommitです。だから、あなたが夜間の建物をつかむなら、あなたはすばらしくなるはずです。

+0

私はその問題を昨日見ましたが、修正プログラムへのリンクをクリックするとページが表示されません。私は最新のビルドを試し、これを見るためにこれをテストしようとします。 – andyroschy

+1

codeplexが部分sha1をもう理解していないように見えます。とにかく、このリンクは動作するはずですhttps://aspnetwebstack.codeplex.com/SourceControl/changeset/8517d73f5f60ffb3e1c8a590af4695c7bda37709 –

関連する問題