かずきのBlog@hatena

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

ASP.NET WebAPIのOData v4でファンクション定義 その2

次はエンテティに関数を生やします。

まずは、ODataConventionsModelBuilderに関数を指定する。

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");
            
            // EntityTypeに関数を生やす
            var addFunction = b.EntityType<Person>()
                .Function("Add");
            addFunction.Returns<double>();
            addFunction.Parameter<double>("x");
            addFunction.Parameter<double>("y");

            config.MapODataServiceRoute(
                "ODataRoute",
                "odata",
                b.GetEdmModel());
        }
    }
}

コントローラーに関数を定義する

普通にメソッドとして定義すればOKです。

[HttpGet]
public IHttpActionResult Add(int key, double x, double y)
{
    return Ok(x + y);
}

keyには、呼び出したときの対象のエンテティのキーが入ります。今回は無視。

呼び出す

T4テンプレートで生成されるクラスからは、以下のようにして呼び出します。

var c = new Container(new Uri("http://localhost:7650/odata"));
var answer = c.People.ByKey(new Dictionary<string, object>
    {
        { "Id", 3 }
    })
    .Add(10, 3)
    .GetValue();
Console.WriteLine(answer);

ByKeyでキー指定して、Addメソッドを呼び出します。