ASP.NET Web API の OData クエリ文字列のサポート: MVC 4 新機能シリーズ


ASP.NET Web API の HTTP GET リクエストでリストを返すアクションなどでは、OData (Open Data Protocol) で定義されているクエリ 文字列 パラメータを使ったデータのソートやフィルターにも容易に対応することができます。

こちらのブログポスト ASP.NET Web API を使ってみよう で使用した SuperHero2 プロジェクトの Get アクション メソッド(下記)を OData クエリをサポートするように変更してみましょう。

   1: namespace SuperHero2.Controllers
   2: {
   3:     public class HeroesController : ApiController
   4:     {
   5:         // GET /api/values
   6:         public IEnumerable<Hero> Get()
   7:         {
   8:             var heroes = new List<Hero>
   9:             {
  10:                 new Hero {Id = 1, Name = "スーパーマン"},
  11:                 new Hero {Id = 2, Name = "バットマン"},
  12:                 new Hero {Id = 3, Name = "ウェブマトリクスマン"},
  13:                 new Hero {Id = 4, Name = "チャッカマン"},
  14:                 new Hero {Id = 5, Name = "スライムマン"}
  15:             };
  16:  
  17:             return heroes;
  18:         }
  19:  
  20:         ...
  21: }


この Get アクション メソッドで、戻り値を IEnumerable<T> から IQueryable<T> に変更して、System.Linq.IQueryable<T> オブジェクトを返すようにします。

   1: namespace SuperHero2.Controllers
   2: {
   3:     public class HeroesController : ApiController
   4:     {
   5:         // GET /api/values
   6:         public IQueryable<Hero> Get()
   7:         {
   8:             var heroes = new List<Hero>
   9:             {
  10:                 new Hero {Id = 1, Name = "スーパーマン"},
  11:                 new Hero {Id = 2, Name = "バットマン"},
  12:                 new Hero {Id = 3, Name = "ウェブマトリクスマン"},
  13:                 new Hero {Id = 4, Name = "チャッカマン"},
  14:                 new Hero {Id = 5, Name = "スライムマン"}
  15:             };
  16:  
  17:             return heroes.AsQueryable();
  18:         }
  19:  
  20:         ...
  21: }

これで、http://localhost:[ポート番号]/api/heroes?$top=3&$orderby=Name のような URI による OData クエリを使用できるようになります。

Heroes2 プロジェクトの Index.cshtml の Web API 呼び出し部分を下記のように変更して実行してみます。

   1: <script type="text/javascript">
   2:     $(function () {
   3:         // Send an AJAX request
   4:         $.getJSON('@Url.Content("~/api/heroes/")' + '?$top=3&$orderby=Name',
   5:             function (data) {
   6:                 ...
   7:             });
   8:     });
   9: </script>

image 

$top=3&$orderby=Name と指定したとおり、名前 (Name) でソートされたデータの上位3つが取得されていることが確認できます。

この OData による クエリ文字列には、下記を使用することができます。

  • $filter - 条件式にマッチしたデータを選択する
  • $orderby - プロパティ名でソートする
  • $skip - 最初の n 個のデータをスキップする
  • $top - 最初の n 個のデータを取得する

OData クエリ文字列の詳細はこちらをご参照ください: OData - Query String Options


この OData のクエリ文字列のサポートはとても便利です。これらを組み合わせて使用することで、グリッド表示などでのデータのページングなどを実装することができます(ASP.NET Single Page Application (SPA) においても使用されています)。

Comments (0)

Skip to main content