odata4 $ filter返回错误结果

时间:2016-04-01 12:20:41

标签: asp.net-web-api odata

我正在使用DataTables odata插件来启动我的html表。搜索时我发送的filter属性如下所示:

$filter=    
indexof(tolower(ClientAlias/Name), 'wee') gt -1 or indexof(tolower(Product/Name), 'wee') gt -1 or indexof
(tolower(User/UserName), 'wee') gt -1 or indexof(tolower(Manager/FullName), 'wee') gt -1 and Status ne
 webapi.Models.ContractStatus'Suspended' and Manager_Id eq '120'

然而,在结果中我绝对得到了与indexof函数匹配的第一个过滤器。例如:

{
ClientAlias:Object{Name="weentertain"}
Manager:
Object { Id="55"}
}

Manager.Id甚至不接近我使用Filter请求的那个。 我的问题是,先前的过滤器是否覆盖了最后一个,或者我是以错误的方式请求它?

1 个答案:

答案 0 :(得分:0)

首先,请注意您提供的示例是对名为Manager_Id的属性进行过滤,但样本结果中不会显示此类属性。您的意思是过滤Manager/Id吗?

您看到的结果归因于operator precedenceand运算符的优先级高于or。您可以通过使用括号将group子串匹配在一起来覆盖优先级。

最后,您可以使用contains函数代替indexof / eq组合来简化子字符串匹配。

这是重写的过滤器(插入换行符以便于阅读):

$filter=
  (contains(tolower(ClientAlias/Name), 'wee') or
   contains(tolower(Product/Name), 'wee') or
   contains(tolower(User/UserName), 'wee') or 
   contains(tolower(Manager/FullName), 'wee')) and
  Status ne webapi.Models.ContractStatus'Suspended' and
  Manager/Id eq '120'