C#
WebAPI
ASP.NET
.NETFramework
OData

ASP.NET Web APIのOData v4でつまづいたところ

基本的にはASP.NET Web API の OData v4 のサポートを参考にしていたが、詰まったところがあったので、メモ。

クエリオプションを付けるとエラーになる

初期設定とContoller側の設定を両方やらないと効かない場合がある。
初期設定で全般的な使用許可を与えて、個別に設定するイメージかな?

初期設定

追加したいクエリオプションが\$count、\$filter、\$orderby、\$expand、\$selectの場合には、WebApiConfig.csで、各種オプションを有効にする。

WebApiConfig.cs
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            ODataModelBuilder builder = new ODataConventionModelBuilder();
            // エンティティを追加
            builder.EntitySet<Customer>("Customers");
            // オプションを有効化 ↓この行を追加(必要なものだけでOK)
            config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 
            // 
            config.MapODataServiceRoute(
                routeName: "ODataRoute",
                routePrefix: null,
                model: builder.GetEdmModel());

        }
    }

各オプションはSystem.Web.OData.Extensions.HttpConfigurationExtensionsで定義されている。

Contoller側の設定

GetメソッドにEnebleQuery属性を追加し、許可したいクエリオプションをAllowedQueryOptionsで指定。
各オプションは「|」で結合

Contoller
        [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Count | AllowedQueryOptions.Skip)]
        public IQueryable<Customer> Get()
        {
            return db.Customer;
        }