読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

ASP.NET OData

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

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