NHibernate を ORM として使用して、VS 2012 で WebApi プロジェクトを作成しました。Odata サポートを有効にする予定です。そこで、データベースのテーブルからエンティティのリストを返す単一の Get メソッドを持つテスト コントローラーを作成しました。
すべて正常に動作し、OData を使用して結果をフィルター処理したり並べ替えたりできます。問題は、データベースからコントローラーに返されるデータの量を制限する方法が見つからなかったことです。このテーブルには何百万ものレコードがあります。初期化。
PageSize
属性のプロパティを使用するQueryable
と、クライアントに返されるデータの量が制限されるように見えますが、DB から返されるデータの量は制限されません。
Take(n)
返す前に get メソッドの内部に適用しようとしましたIQueryable
が、DB から返される結果が制限されますが、OData フィルタリングが壊れます。最初の n 個の結果にないエンティティをクエリしようとすると、空のコレクションを返すだけです。
これを達成するために ODataのパラメーターを使用できることは知っていますが、$Top
何千、何百万ものレコードを不必要に持ち込まないようにするために、それを提供するクライアント/コンシューマーに依存したくありません。使用する。
また、クライアントがクエリ文字列に Top パラメーターを提供したかどうかを手動で確認し、OData 変換を Queryable に適用してから、変換されたクエリにメソッドを適用しようとしましたTake(n)
。このアプローチにより、OData を介して任意のエンティティをフィルター処理できましたが、$Skip=n
パラメーターを使用すると再び空のコレクションが返されるため、ページネーションが壊れます。
では、OData サポートを壊さずに、DB からフェッチされる結果を確実に制限する方法はありますか?