Использование ItemCollection для типа BoxFolder с Box API возвращает только 100 результатов и не может получить остальные.

Некоторое время я использовал Box API для подключения Acumatica ERP к Box, и до недавнего времени все шло нормально. Всякий раз, когда я пытаюсь использовать тип BoxCollection со свойством ItemCollection, я получаю только первые 100 результатов независимо от ограничения, установленного в GetInformationAsync(). Вот фрагмент кода:

            [PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public BoxCollection<BoxItem> GetFolderItems(string folderId, int limit = 500, int offset = 0)
    {
        var response = new BoxCollection<BoxItem>();

            var fieldsToGet = new List<string>() { BoxItem.FieldName, BoxItem.FieldDescription, BoxItem.FieldParent, BoxItem.FieldEtag, BoxFolder.FieldItemCollection };
            response = Task.Run(() => Client.FoldersManager.GetFolderItemsAsync(folderId, limit, offset)).Result;

        return response;

    }

Затем я передаю эту информацию в переменную типа BoxFolder, а затем пытаюсь использовать свойство ItemCollection.Entries, но это возвращает только 100 результатов за раз, без видимого способа извлечь оставшиеся 61 (в моем случае Count = 161, но Entries = 100 всегда)

Другой фрагмент кода используемой переменной, я в основном пытаюсь получить идентификатор папки на основе имени папки внутри Box:

           private static void SyncProcess(BoxFolder rootFolder, string folderName)
    {
        var boxFolder = rootFolder.ItemCollection.Entries.SingleOrDefault(ic => ic.Type == "folder" && ic.Name == folderName);
    }

Я не смог найти ничего, связанного с этим limit = 100 в документации, и это только недавно начало доставлять мне проблемы.

Мне пришлось создать обходной путь, используя следующее:

    var boxCollection = client.GetFolderItems(rootFolder.Id);
            var boxFolder = boxCollection.Entries.SingleOrDefault(ic => ic.Type == "folder" && ic.Name == folderName);

Мне просто интересно, есть ли лучший способ получить полную коллекцию, используя свойство ItemCollection.Entries, как я привык, вместо того, чтобы извлекать их снова.

Спасибо!


person Alexandre Morin    schedule 30.10.2015    source источник


Ответы (1)


Элементы папок Box Pages позволяют сократить время отклика. Размер страницы по умолчанию составляет 100 элементов. Вы должны перебирать страницы, чтобы получить все элементы. Вот фрагмент кода, который будет получать 100 элементов за раз, пока не будут получены все элементы в папке. Вы можете запросить до 1000 товаров одновременно.

var items = new List<BoxItem>();
BoxCollection<BoxItem> result;

do
{
   result = await Client.FoldersManager.GetFolderItemsAsync(folderId, 100, items.Count());
   items.AddRange(result.Entries);
} while (items.Count() < result.TotalCount);
person John Hoerr    schedule 30.10.2015