我只想在OData查询$filter
选项中使用某些属性。
我看到AllowedOrderByProperties
有一个EnableQueryAttribute
参数,但是我没有为$ filter找到另一个参数。我只是想念它吗?如果没有,实施该计划将需要什么?
答案 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亿次呼叫的真实系统中。