私はORMとしてNHibernateを使用してVS 2012でWebApiプロジェクトを作成しました。私はOdataサポートを有効にしようと考えています。そこで私は、データベースのテーブルからエンティティのリストを返す単一のGetメソッドでテストコントローラを作成しました。WebApiコントローラとODATA w/Nhibernateからのサーバサイド結果の制限
すべて正常に動作し、ODataを使用して結果をフィルタリングしたり注文することができます。問題は、データベースからコントローラに返されるデータの量を制限する方法が見つからないことです。その中に何百万もの記録があります。
Queryable
属性のPageSize
プロパティを使用すると、クライアントに返されるデータの量は制限されているように見えますが、DBから返されるデータの量は制限されているようです。
getメソッド内のIQueryable
にTake(n)
を適用しようとしましたが、返される前に結果がDBから返されますが、ODataフィルタリングは中断されます。最初のn回の結果では、空のコレクションを返します。
これを達成するために$Top
パラメータをODataに使用することができますが、クライアント/コンシューマに依存しないことで、数千から数百万ものレコードを不必要に持たないようにしたいと思います。私は使用するつもりはない。
また、クライアントがクエリ文字列にTopパラメータを提供しているかどうかを手動でチェックして、OData変換をクエリ可能に適用し、変換されたクエリに対してTake(n)
メソッドを適用しようとしました。この手法では、ODataを通じてすべてのエンティティをフィルタリングできましたが、$Skip=n
パラメータを使用すると空のコレクションが返されるため、ページネーションが壊れます。
ODataサポートを破らずにDBからフェッチした結果を確実に制限する方法はありますか?
ODataとNHibernateの間のブリッジとして何を使用していますか? ODataをNHibernate IQueryableに変換する手をロールしていますか、またはライブラリを使用していますか?また、過去に私は人々が自動的にAPIを介して返されたすべての結果にTOP 1000を課し、要求されたデータの一部しか受け取っていないことを示す情報を送信し、それは次の1000の結果を返します。呼び出し元は、すべてのデータを受信するまで、指定されたURLを使用し続けます。 –
ODataを使用してクエリのディレクティを作成するのではなく、クライアントが既存のメソッドから返された結果をフィルタリングするための便利なツールとして使用します。例えば、私はNHibernateにLinqを使ってクエリーを実行するGetAllProducts()メソッドを持っていて、そのIQueryableを返します。あなたが記述する振る舞いは、Queryable属性でPageSizeプロパティを使うときのデフォルトの振る舞いですが、私の投稿で言及したように、これはクライアントが受け取るものだけを制限しますが、DBから私のサービスメソッドにフェッチされる結果は制限しません。 – andyroschy