为Microsoft Graph创建一个过滤查询,其工作原理等同于“包含”

时间:2018-09-13 21:16:48

标签: search filter odata microsoft-graph

我需要为 Microsoft Graph API 创建一个$filter查询,以查询字符串中的特定单词(用户的显示名称)。

例如,我希望能够找到名称中具有“ Esteban” 的所有用户:

  

路易斯·埃斯特万
  阿方斯·埃斯特万
  埃斯特万·路易斯
  阿方斯·埃斯特万·路易斯

以下查询有效,但仅返回名称中以“ Esteban” 开头的用户,而不返回包含“ Esteban” 的用户:

https://graph.microsoft.com/v1.0/users?$filter=startswith(displayName,'Esteban')

我也尝试使用contains而不是startswith,但是它给出了错误响应:

  

{“错误”:{“代码”:“ Request_BadRequest”,“消息”:“发现了一个名称为'contains'的未知函数。这也可能是在导航属性上的键查找,这是不允许的。 “,” innerError“:{” request-id“:” e5ed5c30-4e62-4497-8976-1d38167e759d“,” date“:” 2018-09-13T23:17:17“}}}

即使Microsoft Graph docs说他们支持 OData 4.0 ,他们也这样说:

  

“任何Microsoft Graph资源当前均不包含contains字符串运算符。”

我还尝试了filter和其他查询参数支持的OData documentationconstruction rules给出的其他命令。

我特别尝试了以下命令的组合:

  


开始   以
结尾   indexof
  子串

但没有成功。看来 MS Graph API 除了startswith之外什么都不支持。

我尝试了v1.0和API的beta端点。

还有其他方法吗? OData 4.0 命令和/或 MS Graph API 支持的查询参数的某种智能组合,可以实现等效搜索到contains

PS:您可以使用Graph Explorer here试用查询。

4 个答案:

答案 0 :(得分:3)

您知道,Graph API现在不支持您的要求。我的建议是先获取用户列表,然后再进行内存过滤。这种方式也适用于其他不受支持的Graph API。

同时,在existing feature request中投票给User Voice或提交一个新的。

答案 1 :(得分:2)

这似乎是唯一一种可以获取所需列表而无需自己过滤所有用户的替代方法

https://graph.microsoft.com/v1.0/me/people?$search=Esteban&$top=100000

根据此blog post,Microsoft-graph API仅支持 $ filter
等于(eq)
不等于(ne)
大于(gt)
大于或等于(ge)
小于(lt),小于或等于(le)
和(和)
或(或)
不是(不是)
开始于
任何

$ search 仅支持“消息”和“人”实体。

答案 2 :(得分:0)

您可以使用 $search 查询参数,但您必须包含参数 ConsistencyLevel=eventual 才能使其工作。此外,$top 的最大值为 999。

https://graph.microsoft.com/v1.0/users?$top=999&ConsistencyLevel=eventual&$search="displayName:Esteban"

答案 3 :(得分:-2)

我对这个特定的API并不熟悉,但是由于它是OData服务,因此它可能支持参数

$filter=substringof('Test',FieldName)
$filter=substringof('Esteban', displayName)

请注意,与startswith相比,它的参数顺序相反。

检出OData Docs here其他过滤器选项