かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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を含んだ結果を返してくれるのでいい感じ。