Фильтрация нескольких возможных значений с помощью ExtendedProperties и Office 365 REST API

Я пытаюсь получить список электронных писем с учетом их Идентификатор ИнтернетСообщения.

Для одного заданного InternetMessageID я могу получить соответствующую почту, следуя предоставленному синтаксису в документации по Outlook

 "https://outlook.office365.com/api/beta/me/messages?$filter=SingleValueExtendedProperties/any(ep:  ep/PropertyId eq 'String 0x1035' and ep/Value eq '<[email protected]>' )";

Теперь предположим, что я хочу получить два письма с одним и тем же запросом. Мне не удалось получить успешный синтаксис.

Например

 "https://outlook.office365.com/api/beta/me/messages?$filter=SingleValueExtendedProperties/any(ep:  ep/PropertyId eq 'String 0x1035' and (ep/Value eq '<[email protected]>' or ep/value eq '[email protected]'))";

не работает. BadRequest возвращается с сообщением

The filter expression for $filter does not match to a single extended property and a value restriction.

Я пробовал множество комбинаций группировки, а также тестировал оператор $expand, как это предлагается в this вопрос. Есть ли способ выполнять такие запросы с помощью Outlook Web Api или Graph API?


person Benoit Patra    schedule 26.11.2015    source источник


Ответы (1)


Я только что попробовал это, и я получаю более информативное сообщение об ошибке:

{
  "error": {
    "code": "ErrorInvalidUrlQueryFilter",
    "message": "The filter expression for $filter on property ExtendedProperty only allows 
               [and] and [eq] operators. The equality can only be specified between 
               'PropertyId' and a constant or 'Value' and a constant (for example: 
               PropertyId eq 'value')."
  }
}

ОБНОВЛЕНИЕ: Проверено моей командой инженеров, и эта ошибка относится к тому, что находится внутри оператора ANY. Вы не можете использовать ИЛИ там. Итак, чтобы это работало, вам нужны два отдельных оператора ANY, соединенных оператором ИЛИ:

https://outlook.office.com/api/beta/me/messages?$filter=
  SingleValueExtendedProperties/any(ep: ep/PropertyId eq 'String 0x1035' 
                                    and ep/Value eq 'someid@somedomain') or 
  SingleValueExtendedProperties/any(ep: ep/PropertyId eq 'String 0x1035' 
                                    and ep/Value eq 'otherid@otherdomain')
person Jason Johnston    schedule 30.11.2015
comment
Спасибо! В итоге я использовал EWS вместо API Office 365 (к счастью, azureAD позволяет нам это сделать). Когда это станет возможным, я, вероятно, вернусь к использованию Office365 REST API. - person Benoit Patra; 01.12.2015
comment
Для информации: похоже, что этот тип запроса не может содержать более 9 'Или' - person Benoit Patra; 13.12.2015
comment
Джейсон, возможно ли сделать описанный выше фильтр (только для одного идентификатора сообщения) с новым API Graph? Похоже, что тот же запрос не работает в отношении graph.microsoft.com/v1.0/me/messages?$filter=... Я вижу код ошибки BadRequest и сообщение Недопустимое предложение фильтра - person garrettm; 10.06.2020
comment
@garrettm Новый API Graph сильно отличается от API EWS и O365. Вы можете связать предложения вместе, используя $filter следующим образом: )+или+Содержит(Тема,'роль')" rel="nofollow noreferrer">graph.microsoft.com/v1.0/users/[email protected]/ - person Midiman; 07.12.2020