かずきのBlog@hatena

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

ASP.NET WebAPIのODataで一番小回りが利くっぽい方法

自分用走り書きメモ

やり方はいろいろあるけれど

var b = new ODataConventionModelBuilder();
b.EntitySet<HogeEntity>("Hoges"); // HogesControllerにアクセスがいくようになる
config.Routes.MapODataRoute("odata", "odata", b.GetEdmModel());

みたいにして、メタデータは組み立てておいてControllerはODataControllerを継承してGetメソッドを以下のようにするのがよさげ。

namespace SampleApp.Controllers
{
    public class HogesController : ODataController
    {
        protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
        {
            base.Initialize(controllerContext);
            // なんか初期化しましょう
        }


        // ODataのクエリオプションは引数で受ける(TopやSkipとかが使える)
        public PageResult<HogeEntity> Get(ODataQueryOptions<HogeEntity> options)
        {
            var results = データを取得する();
            return new PageResult<LogData>(
                results,
                データに続きがあるなら続きを取得するためのURL, 
                トータルデータ件数);
        }

        protected override void Dispose(bool disposing)
        {
            // コネクションとかは切りましょう
        }
    }
}

PageResult型を返すようにしておくと、続きのデータ取得するためのURLを含んだ結果を返してくれるのでいい感じ。