【发布时间】:2018-08-27 13:51:22
【问题描述】:
我只想允许在 OData 查询 $filter 选项中使用某些属性。
我看到EnableQueryAttribute 有一个AllowedOrderByProperties 参数,但我没有为$filter 找到另一个参数。我只是错过了吗?如果没有,实施它需要什么?
【问题讨论】:
标签: c# asp.net-web-api odata
我只想允许在 OData 查询 $filter 选项中使用某些属性。
我看到EnableQueryAttribute 有一个AllowedOrderByProperties 参数,但我没有为$filter 找到另一个参数。我只是错过了吗?如果没有,实施它需要什么?
【问题讨论】:
标签: c# asp.net-web-api odata
您可以尝试以下方法:
一旦您有了构建器,您就可以列出 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);
如果某个字段不可过滤,则会引发异常。
【讨论】:
我认为您将推出自己的过滤器验证,因为您要过滤的内容没有任何内置语言。这可能对您有帮助,也可能没有帮助,但我建议使用 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 在一个每天有成千上万个调用的真实系统中。
【讨论】: