通过Web API中的属性限制OData $ filter

时间:2018-08-27 13:51:23

标签: c# asp.net-web-api odata

我只想在OData查询$filter选项中使用某些属性。

我看到AllowedOrderByProperties有一个EnableQueryAttribute参数,但是我没有为$ filter找到另一个参数。我只是想念它吗?如果没有,实施该计划将需要什么?

2 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

一旦有了构建器,就可以列出entitySet的属性,然后可以提及该字段是否可过滤。

var entityTypeConfig = builder.EntitySet<SomeType>("SomeType").EntityType;
entityTypeConfig.Property(x => x.SomeField);
entityTypeConfig.Property(x => x.SomeField2).IsNotFilterable().IsNonFilterable();
// not sure what is the difference between them

并在控制器操作(例如httpGet)中添加

options.Filter.Validate(allowedOptions);

如果字段不可过滤,则会引发异常。

答案 1 :(得分:1)

我认为您将要进行自己的过滤器验证,因为围绕您所过滤的内容没有任何内置语言。这可能对您有帮助,也可能没有帮助,但我建议您使用ModelBinder进行验证,因此在运行控制器方法时,您已经验证了所有参数的内容。我的建议是从ModelBinder返回一个对象,该对象可以满足您应用程序中的业务需求。您当然可以使用OData构造来帮助您做到这一点。这是我们系统中启动该过程的代码段。可以帮助您继续使用自己的活页夹。

private T CreateQueryOptions<T>(string url, [CallerMemberName] string caller = null) where T : class
{
    var httpRequest = new HttpRequestMessage(HttpMethod.Get, url);
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<T>(caller);
    var odata =  new ODataQueryOptions<T>(new ODataQueryContext(modelBuilder.GetEdmModel(), typeof(T)), httpRequest);
    // rest of your code here to validate OData parameters  Generics may not be appropriate for you.
}

但这works for me在一个每天有100亿次呼叫的真实系统中。