以前工作的 Microsoft Graph 请求的 InefficientFilter 错误

InefficientFilter error on Microsoft Graph requests which were previously working

向 MS Graph 发出以下请求以检索按截止日期排序的标记邮件:

https://graph.microsoft.com/beta/me/messages?$filter=flag/flagStatus%20eq%20%27flagged%27&$orderby=flag/dueDateTime/dateTime%20desc&$top=100

之前会成功并返回预期结果。最近一些用户收到了以下回复:

{
  "error": {
    "code": "InefficientFilter",
    "message": "The restriction or sort order is too complex for this operation.",
    "innerError": {
      "request-id": "5ef714c9-39a0-4167-a4d0-3682dcb46de4",
      "date": "2016-11-17T16:41:16"
    }
  }
}

图表中是否引入了错误?

奇怪的是,这个请求以前很好,现在看起来效率很低。它也只发生在某些用户的帐户上。

同样的问题也发生在以下检索按接收日期排序的电子邮件附件的请求中:

https://graph.microsoft.com/v1.0/me/messages?$filter=hasAttachments%20eq%20true&$orderby=receivedDateTime%20desc&$expand=attachments($select=name,contentType,size,lastModifiedDateTime)&$top=6

现在得到相同的 InefficientFilter 错误响应。请注意,第二个请求是针对 v1.0 API,因此不限于测试版。

另请注意,删除受影响帐户上的 orderby 子句将导致请求成功。

这是 intentional (and breaking) change 为解决过滤的主要问题而制作的。 $orderby 仍然很重要。

总结 link,如果您在请求中同时使用 $orderby$filter

  1. $orderby 中的任何字段也必须在 $filter.
  2. $filter 中的字段顺序很重要:
    1. 同样在 $orderby 中的字段必须在 $filter 中排在第一位,并且必须采用相同的顺序。
    2. 不在 $orderby 中的字段必须在 $orderby 中的字段之后。

所以根据这些指南,您的请求的问题是 flag/dueDateTime/dateTime 不存在于 $filter 中。