かずきのBlog@hatena

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

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