ODataいつの間にかv4になってたんですね。知らなかった。ということで、ちょっと触ってみました。
プロジェクトの作成
ASP.NETのEmptyを選んで、Web APIにチェックを入れてOKを押します。
これで必要最低限の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
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" }
とりあえずこんな感じで。