Дельта-запрос «Сообщения» Microsoft Graph усекает слишком много результатов с фильтром даты - PullRequest
0 голосов
/ 22 января 2019

Я думаю, что нашел ошибку с фильтрацией даты в delta API.

В одной из учетных записей электронной почты, с которой я работаю с помощью API-интерфейса Office 365, обнаруживается, что дельта-запрос API-интерфейса «сообщений» возвращает другое количество элементов, чем фактически находится в папке, в течение ожидаемого диапазона времени , В папке содержится 150 000 элементов, охватывающих 10 лет, но delta возвращает только последние 5000 элементов, охватывающих последние 60 дней или около того.

Пейджинг работает отлично

При запросе API-интерфейса к графу для папки «Входящие» в ней содержится 154 045 элементов и 57 456 непрочитанных элементов.

IUserMailFoldersCollectionPage foldersPage =
                await client.Users[mailboxid].MailFolders.Request().GetAsync();

Я могу пропустить более 10000, 50000 или более сообщений с помощью подкачки.

model.messages = await client.Users[mailboxid].MailFolders[folderid].Messages.Request().Top(top)
                    .Skip(skip).GetAsync();

Дельта с фильтром даты не работает

Но при зацикливании с помощью nextToken и deltaTokens deltaToken появляется примерно после 5000 сообщений электронной почты. По сути, кажется, что он возвращает результаты только за последние пару месяцев, хотя фильтр говорит, что находил сообщения за последние 20 лет.

Вот пример того, как мы генерируем запрос Delta. Время здесь жестко запрограммировано, но на самом деле это переменная.

var sFilter = $"receivedDateTime ge {DateTimeOffset.UtcNow.AddYears(-20).ToString("yyyy-MM-dd")}";
model.messages = await client.Users[mailboxid].MailFolders[folderid].Messages.Delta().Request()
                    .Header("Prefer", "odata.maxpagesize=" + maxpagesize)
                    .Filter(sFilter)
                    .OrderBy("receivedDateTime desc")
                    .GetAsync();

И затем на каждой операции подкачки я делаю следующее. «nexttoken» - это следующая или дельта-ссылка, в зависимости от того, что вернулось из первого запроса.

model.messages = new MessageDeltaCollectionPage();
                model.messages.InitializeNextPageRequest(client, nexttoken);
                model.messages = await model.messages.NextPageRequest
                    .Header("Prefer", "odata.maxpagesize=" + maxpagesize)
                    .GetAsync();

Дельта без фильтра работает

Если я делаю тот же самый код для дельты выше, но удаляю операцию «Фильтр» на дату, тогда я получаю все сообщения в папке.

Это не очень хорошее решение, так как обычно мне нужны только сообщения за последний год или два года, и если существует 15 лет сообщений, это огромная трата, чтобы запросить все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...