使用 WebAPI 在 OData V4 端点上启用嵌套的任何查询
Enabling nested any queries on OData V4 endpoints with WebAPI
我正在尝试像这样构建一个嵌套的任何查询...
~/Api/Calendar?$filter=Roles/any(r:r/User/any(u:u/Name eq 'Joe
Bloggs'))
如果我删除内部的任何子句,我将...
~/Api/Calendar?$filter=Roles/any(r:r/User/any())
... 然后端点 returns ...
{
"error": {
"code": "",
"message": "The query specified in the URI is not valid. The Any/All nesting limit of '1' has been exceeded. 'MaxAnyAllExpressionDepth' can be configured on ODataQuerySettings or EnableQueryAttribute."
}
}
...我认为这对问题有所启发,但实际上我在这里。
到目前为止,我已经尝试在我的上下文初始化期间用它提高这个限制,但它似乎没有用....
config.AddODataQueryFilter(new EnableQueryAttribute { MaxAnyAllExpressionDepth = 3 });
有没有人知道我如何在全局范围内执行此操作(我不想在每个控制器上执行每个 get 操作并设置深度。
更新:
结果是我从我自己的 baseEntityController 继承的地方,在我有 EnableQuery 属性的操作上,它取代了我的全局配置更改,这就是我的更改没有得到尊重的原因。
简单地从动作本身中删除属性,所有从我的基础继承的控制器都可以使用这个新的嵌套的任何和所有限制,但我现在似乎有扩展不再起作用的副作用.. .
var query = new EnableQueryAttribute {
MaxExpansionDepth = 8,
PageSize = 100,
MaxAnyAllExpressionDepth = 3,
AllowedFunctions = System.Web.OData.Query.AllowedFunctions.All,
AllowedLogicalOperators = System.Web.OData.Query.AllowedLogicalOperators.All,
AllowedQueryOptions = System.Web.OData.Query.AllowedQueryOptions.All,
AllowedArithmeticOperators = System.Web.OData.Query.AllowedArithmeticOperators.All,
MaxTop = 1000
};
config.AddODataQueryFilter(query);
.. 如您所见,我尝试在其中添加很多额外内容,但其中一个都没有!
我发现执行此操作并使一切正常的最简单方法是将属性应用于基本控制器操作,因此它将所有内容正确地应用于该控制器或其任何派生类型上的操作。
这不是我的理想,但我找不到一种方法来获得全局修复,使其作为初始化 odata 上下文的一部分工作。
希望这会对外面的人有所帮助。
我正在尝试像这样构建一个嵌套的任何查询...
~/Api/Calendar?$filter=Roles/any(r:r/User/any(u:u/Name eq 'Joe Bloggs'))
如果我删除内部的任何子句,我将...
~/Api/Calendar?$filter=Roles/any(r:r/User/any())
... 然后端点 returns ...
{
"error": {
"code": "",
"message": "The query specified in the URI is not valid. The Any/All nesting limit of '1' has been exceeded. 'MaxAnyAllExpressionDepth' can be configured on ODataQuerySettings or EnableQueryAttribute."
}
}
...我认为这对问题有所启发,但实际上我在这里。
到目前为止,我已经尝试在我的上下文初始化期间用它提高这个限制,但它似乎没有用....
config.AddODataQueryFilter(new EnableQueryAttribute { MaxAnyAllExpressionDepth = 3 });
有没有人知道我如何在全局范围内执行此操作(我不想在每个控制器上执行每个 get 操作并设置深度。
更新:
结果是我从我自己的 baseEntityController 继承的地方,在我有 EnableQuery 属性的操作上,它取代了我的全局配置更改,这就是我的更改没有得到尊重的原因。
简单地从动作本身中删除属性,所有从我的基础继承的控制器都可以使用这个新的嵌套的任何和所有限制,但我现在似乎有扩展不再起作用的副作用.. .
var query = new EnableQueryAttribute {
MaxExpansionDepth = 8,
PageSize = 100,
MaxAnyAllExpressionDepth = 3,
AllowedFunctions = System.Web.OData.Query.AllowedFunctions.All,
AllowedLogicalOperators = System.Web.OData.Query.AllowedLogicalOperators.All,
AllowedQueryOptions = System.Web.OData.Query.AllowedQueryOptions.All,
AllowedArithmeticOperators = System.Web.OData.Query.AllowedArithmeticOperators.All,
MaxTop = 1000
};
config.AddODataQueryFilter(query);
.. 如您所见,我尝试在其中添加很多额外内容,但其中一个都没有!
我发现执行此操作并使一切正常的最简单方法是将属性应用于基本控制器操作,因此它将所有内容正确地应用于该控制器或其任何派生类型上的操作。
这不是我的理想,但我找不到一种方法来获得全局修复,使其作为初始化 odata 上下文的一部分工作。
希望这会对外面的人有所帮助。