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: }

これで、https://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) においても使用されています)。