为 Microsoft Graph 创建与“包含”等效的筛选查询

Posted

技术标签:

【中文标题】为 Microsoft Graph 创建与“包含”等效的筛选查询【英文标题】:Create a filter query for Microsoft Graph that works equivalent to "contains" 【发布时间】:2019-02-18 16:09:14 【问题描述】:

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

例如,我希望能够找到所有名称中包含 "Esteban" 的用户:

路易斯·埃斯特班 阿尔方斯·埃斯特班 埃斯特班·路易斯 阿尔方斯·埃斯特班·路易斯

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

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

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

"error": "code": "Request_BadRequest", "message": "一个名为 'contains' 的未知函数被发现。这也可能是对导航属性的键查找,这是不允许的。 ", "innerError": "request-id": "e5ed5c30-4e62-4497-8976-1d38167e759d", "date": "2018-09-13T23:17:17"

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

“目前任何 Microsoft Graph 资源都不支持包含字符串运算符。”

我还尝试了OData documentation 和construction rules 给出的其他命令,这些命令应该由filter 和其他查询参数支持。

我特别尝试了这些命令的组合:

开始于 结束于 索引 子串

但没有成功。似乎 MS Graph API 不支持除 startswith 之外的任何东西。

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

有没有其他方法,OData 4.0 命令和/或 MS Graph API 支持的查询参数的智能组合,允许搜索等效到contains?

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

【问题讨论】:

我担心这是不可能的,但我也觉得应该有办法。 MS 文档说:“目前任何 Microsoft Graph 资源都不支持包含字符串运算符。” 在线搜索,似乎人们至少从 2014 年就开始请求此功能。 谢谢你,我会尝试研究,看看我是否找到了一些东西并更新帖子。 好像还是不支持,但是能不能不把所有用户都拿到,然后自己过滤呢?从以前的帖子中我可以看到的唯一替代方法是使用支持 $search 查询的 People API 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

根据blog post,microsoft-graph api 仅支持 equals (eq) 的 $filter 不等于 (ne) 大于 (gt) 大于或等于 (ge) 小于(lt),小于等于(le) 和(和) 或(或) 不(不) 开始于 任何$search 仅支持“messages”和“person”实体。

【讨论】:

感谢您的帮助,但主要问题是我需要与表用户合作,并且此表不支持查询:graph.microsoft.com/v1.0/users?$search=Esteban&$top=999 throws: "message": "此查询不受支持.", 我明白,但这不能有效地处理相同的数据集并为您提供所需的信息吗?当我将其插入默认的 Microsoft 图形资源管理器 api 时,它似乎可以工作。 我用 /groups 试过这个,它也有效(截至 2021 年 8 月),仅供参考 @Ricardo Guerrero 它应该与 /users 一起使用。语法实际上是 search=":",例如https://graph.microsoft.com/v1.0/users?ConsistencyLevel=eventual&$search="givenName:Esteban"https://graph.microsoft.com/v1.0/groups?ConsistencyLevel=eventual&$search="displayName:Esteban's Group"https://graph.microsoft.com/v1.0/users?ConsistencyLevel=eventual&$search="givenName:Esteban" OR "surname:Esteban"【参考方案3】:

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

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

【讨论】:

这很好用!不知道为什么它被否决。谢谢指点!搜索功能主要用于替换 $filter 的 contains、substringof、startswith 和 indexof。

以上是关于为 Microsoft Graph 创建与“包含”等效的筛选查询的主要内容,如果未能解决你的问题,请参考以下文章

Azure Developer使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法

MS Graph API:microsoft.graph.createLink 未创建匿名视图链接

使用 Microsoft Graph 为日历创建新事件时出现空异常

是否可以在 Microsoft Graph 中为每个用户存储一个音频文件?

使用 microsoft graph API 创建事件时设置自己的事件 ID

当事件来自 Microsoft Graph 上的邀请时,日历事件的类别数组为空