【问题标题】:Limit OData $filter by property in Web API通过 Web API 中的属性限制 OData $filter
【发布时间】:2018-08-27 13:51:22
【问题描述】:

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

我看到EnableQueryAttribute 有一个AllowedOrderByProperties 参数,但我没有为$filter 找到另一个参数。我只是错过了吗?如果没有,实施它需要什么?

【问题讨论】:

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


    【解决方案1】:

    您可以尝试以下方法:

    一旦您有了构建器,您就可以列出 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);
    

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

    【讨论】:

      【解决方案2】:

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

      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 在一个每天有成千上万个调用的真实系统中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 2013-02-22
        • 2015-05-24
        • 1970-01-01
        • 2014-04-25
        • 2018-08-18
        • 1970-01-01
        相关资源
        最近更新 更多