かずきのBlog@hatena

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

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メソッドを呼び出します。