ASP.NETのWeb APIのODataでは、下に示すように、Queryable APIの助けを借りて特定のアクション用のODataクエリシンタックスを使用することができる。
[Queryable]
public IQueryable<WorkItem> Get(int projectId)
しかし、もしあなたの組織外にクエリ可能なアクションを公開しするなら、クエリバリデーションの助けを借りて、保護層を追加することで、サービスを保護すべきである。 Microsoftの Program Managerである Hongmei Ge氏は、最近 Queryable APIで、バリデーションを適用できる、様々なシナリオを検討した。
氏によって指摘された最初のシナリオは、下に示すように AllowedQueryOptionsと呼ばれるプロパティを使って、$top と $skipを持つクエリだけを許すのである。
[Queryable(AllowedQueryOptions = AllowedQueryOptions.Skip | AllowedQueryOptions.Top)]
public IQueryable<WorkItem> Get(int projectId)
MaxTop と MaxSkipプロパティを使って、$top と $skipの値を100と200に制限できる。
[Queryable(MaxTop = 100)]
public IQueryable<WorkItem> Get(int projectId)
[Queryable(MaxSkip = 200)]
public IQueryable<WorkItem> Get(int projectId)
AllowedOrderbyPropertiesを使って、結果をIdプロパティによって並び替えられる。なぜなら任意のプロパティによる並び替えは、遅い可能性がある。
[Queryable(AllowedOrderByProperties = "Id")]
public IQueryable<WorkItem> Get(int projectId)
もしあなたのクライアントが$filter内で Equal比較を使っているなら、AllowedLogicalOperatorsを使ってそれを検証すべきである。
[Queryable(AllowedLogicalOperators = AllowedLogicalOperators.Equal)]
public IQueryable<WorkItem> Get(int projectId)
AllowedArithmeticOperators の値をNoneにセットすれば、$filter で算術演算をオフすることができる。
[Queryable(AllowedArithmeticOperators = AllowedArithmeticOperators.None)]
public IQueryable<WorkItem> Get(int projectId)
AllowedFunctionsプロパティを使って、$filterにおける関数の使い方を制限できる。
[Queryable(AllowedFunctions = AllowedFunctions.StartsWith)]
public IQueryable<WorkItem> Get(int projectId)
上記のコードは、StartsWith関数だけが$filterで使えることを意味している。
氏はまた、$skip, $top, $orderby, $filterに対するデフォルトのバリデーションロジックやクエリをバリデートするためにODataQueryOptions の使い方をカスタマイズするような、高度なシナリオでクエリバリデーションを説明している。