在具有 Box API 的 BoxFolder 类型上使用 ItemCollection 仅 returns 100 个结果并且无法检索其余结果
Using ItemCollection on a BoxFolder type with Box API only returns 100 results and cannot retrieve the remaining ones
一段时间以来,我一直在使用 Box API 将 Acumatica ERP 连接到 Box,直到最近一切正常。每当我尝试将 BoxCollection 类型与 属性 ItemCollection 一起使用时,无论我在 GetInformationAsync() 中设置的限制如何,我都只会获得前 100 个结果。这是代码片段:
[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 属性,但这一次只能 returns 100 个结果,没有提取剩余 61 的可见方法(在我的例子中,Count = 161,但 Entries = 100 始终)
所用变量的另一个代码片段,我基本上是尝试根据 Box 中文件夹的名称获取文件夹 ID:
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 来获取完整的 collection,而不必再次获取它们。
谢谢!
框页面文件夹项目以缩短响应时间。默认页面大小为 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);
如果列表中有 external/shared 个文件夹,John 的回答可能会导致您的项目 collection 中出现重复值。当您使用“asUser”header 集调用“GetFolderItemsAsync”时,这些将被隐藏。
在 Box API 的代码集本身 (https://github.com/box/box-windows-sdk-v2/blob/main/Box.V2/Managers/BoxFoldersManager.cs)
中有关于它的评论
Note: If there are hidden items in your previous response, your next offset should be = offset + limit, not the # of records you received back.
The total_count returned may not match the number of entries when using enterprise scope, because external folders are hidden the list of entries.
考虑到这一点,最好不要依赖于比较检索到的项目数和 TotalCount 属性。
var items = new List<BoxItem>();
BoxCollection<BoxItem> result;
int limit = 100;
int offset = 0;
do
{
result = await Client.FoldersManager.GetFolderItemsAsync(folderId, limit, offset);
offset += limit;
items.AddRange(result.Entries);
} while (offset < result.TotalCount);
一段时间以来,我一直在使用 Box API 将 Acumatica ERP 连接到 Box,直到最近一切正常。每当我尝试将 BoxCollection 类型与 属性 ItemCollection 一起使用时,无论我在 GetInformationAsync() 中设置的限制如何,我都只会获得前 100 个结果。这是代码片段:
[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 属性,但这一次只能 returns 100 个结果,没有提取剩余 61 的可见方法(在我的例子中,Count = 161,但 Entries = 100 始终)
所用变量的另一个代码片段,我基本上是尝试根据 Box 中文件夹的名称获取文件夹 ID:
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 来获取完整的 collection,而不必再次获取它们。
谢谢!
框页面文件夹项目以缩短响应时间。默认页面大小为 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);
如果列表中有 external/shared 个文件夹,John 的回答可能会导致您的项目 collection 中出现重复值。当您使用“asUser”header 集调用“GetFolderItemsAsync”时,这些将被隐藏。 在 Box API 的代码集本身 (https://github.com/box/box-windows-sdk-v2/blob/main/Box.V2/Managers/BoxFoldersManager.cs)
中有关于它的评论Note: If there are hidden items in your previous response, your next offset should be = offset + limit, not the # of records you received back.
The total_count returned may not match the number of entries when using enterprise scope, because external folders are hidden the list of entries.
考虑到这一点,最好不要依赖于比较检索到的项目数和 TotalCount 属性。
var items = new List<BoxItem>();
BoxCollection<BoxItem> result;
int limit = 100;
int offset = 0;
do
{
result = await Client.FoldersManager.GetFolderItemsAsync(folderId, limit, offset);
offset += limit;
items.AddRange(result.Entries);
} while (offset < result.TotalCount);