かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ASP.NET WebAPIのOData v4の機能を使ってみる

ODataいつの間にかv4になってたんですね。知らなかった。ということで、ちょっと触ってみました。

プロジェクトの作成

ASP.NETのEmptyを選んで、Web APIにチェックを入れてOKを押します。

f:id:okazuki:20140927145634p:plain

これで必要最低限のWeb APIに特化したプロジェクトが作られます。

次にNuGetでASP.NET WebAPIのODataのv4を入れます。NuGetでASP.NET ODataで検索すると”Microsoft ASP.NET Web API 2.2 for OData v4.0"がみつかるので、それをインストールします。

ODataのコントローラとエンテティの作成

ControllersフォルダにPeopleControllerクラスを追加します。(コントローラの作成からODataのコントローラを作成するとv3のが作成されるのでしないでね)そして、ODataControllerを継承します。

IHttpActionResult Get(int key)とIQueryable Get()の2つのメソッドを追加します。中身は適当に返すだけです。

using System.Linq;
using System.Web.Http;
using System.Web.OData;

namespace WebApplication5.Controllers
{
    public class PeopleController : ODataController
    {
        public IQueryable<Person> Get()
        {
            return Enumerable.Range(1, 10)
                .Select(i => new Person
                {
                    Id = i, 
                    Name = "tanaka" + i
                })
                .AsQueryable();
        }

        // keyという名前は重要なので変えないで
        public IHttpActionResult Get(int key)
        {
            return Ok(new Person { Id = key, Name = "tanaka" + key });
        }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

コントローラの登録

ODataのメンドクサイところは、コントローラを1つ1つ職人の手によって登録しないといけないところです。規約も作れそうな雰囲気を醸し出してるけど、ちょっとやり方がわからん…。

App_StartフォルダにあるWebApiConfig.csの中でODataConventionModelBuilderを使ってEntitySetを登録します。

using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions; // MapODataServiceRouteに必要
using WebApplication5.Controllers;

namespace WebApplication5
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            var b = new ODataConventionModelBuilder();
            b.EntitySet<Person>("People");
            config.MapODataServiceRoute(
                "ODataRoute",
                "odata",
                b.GetEdmModel());
        }
    }
}

実行して動作確認

実行して、以下のようなURLでPeopleにアクセスできます。

http://localhost:7650/odata/People

結果は以下のようになります。

{
  "@odata.context":"http://localhost:7650/odata/$metadata#People","value":[
    {
      "Id":1,"Name":"tanaka1"
    },{
      "Id":2,"Name":"tanaka2"
    },{
      "Id":3,"Name":"tanaka3"
    },{
      "Id":4,"Name":"tanaka4"
    },{
      "Id":5,"Name":"tanaka5"
    },{
      "Id":6,"Name":"tanaka6"
    },{
      "Id":7,"Name":"tanaka7"
    },{
      "Id":8,"Name":"tanaka8"
    },{
      "Id":9,"Name":"tanaka9"
    },{
      "Id":10,"Name":"tanaka10"
    }
  ]
}

ODataなのでID指定も可能。

http://localhost:7650/odata/People(3)
{
  "@odata.context":"http://localhost:7650/odata/$metadata#People/$entity","Id":3,"Name":"tanaka3"
}

とりあえずこんな感じで。