.net 使用Google Drive API按文件夹Id检索子项

.net 使用Google Drive API按文件夹Id检索子项,.net,google-drive-api,.net,Google Drive Api,是否有任何有效的方法按父文件夹id加载项目?到目前为止,我只找到了以下方法: var children = _driveService.Children.List(folderId).Execute().Items; var result = children.Select(i => { var item = _driveService.Files.Get(i.Id).Execute(); return item; }); 及 但是我不喜欢它们,因为它们很慢而且看

是否有任何有效的方法按父文件夹id加载项目?到目前为止,我只找到了以下方法:

var children = _driveService.Children.List(folderId).Execute().Items;

var result = children.Select(i =>
{
     var item = _driveService.Files.Get(i.Id).Execute();

     return item;
});


但是我不喜欢它们,因为它们很慢而且看起来很愚蠢。没有更好的方法吗?

我最喜欢2种方法,因为添加其他条件(例如trashed=false以仅获取未被破坏的文件)更简单,因此您可以获得一个用于搜索和列出所有内容的函数

经常使用Google Drive API,我发现性能上的主要问题是由于单个文件中附加了大量信息(上次,而大多数时候我们的应用程序只需要几个信息;幸运的是,您可以使用搜索中的
items
参数获得部分响应)(有关更多信息,请参阅)

根据经验,在我去年做了一些测试之后,只获得了标题、上次更新日期和id,每个结果的数据传输量减少了近90%,这相当于数据传输的改进


如果您确实需要获取所有文件元数据,我建议您首先获取项目列表,如例2所示,但仅获取
fileId
,然后使用Parallel.ForEach(.Net 4.0+)通过并行请求获取所有文件元数据。

我可以通过以下方式提高性能:

var items = _driveService.Files.List();

items.Q = string.Format("'{0}' in parents and trashed = false", folderId);
items.Fields = "items(id,title,fileSize,mimeType)";

var result = items.Execute().Items;

感谢@smokybob

同意第一部分,但不一定使用多个parallel file.get。这可能会生成大量http请求,这些请求会计入配额。最终可能会由驱动器控制流,这不是一个令人愉快的地方。我发现,通过适当设置items参数,可以对列表结果进行分页启用gzip可以提供最佳吞吐量。您可以始终从一个小的maxResults开始,这样用户就不会等待第一个结果太长时间,然后在后续请求中将其增加到100。@smokybob,谢谢,我忘了检查性能提示部分。现在我尝试了以下方法:items.Fields=“items(id,title,fileSize,mimeType)”;它成功了,但仍然非常慢。那么,你是说我应该使用TPL,没有“优雅”的方法来优化它吗?@GiorgiZautashvili TPL只有在你需要大量文件的“大”数据时才需要;因为正如pinoyyid所指出的,你会更快地达到最大请求配额(1000万请求/天;如果你有1000个用户,这是可能的)。我们只有在使用TPL获取元数据是合理的情况下,才可以将文件克隆到另一个帐户;否则,我们将获取有限的文件,以便尽可能快地显示信息(通常为顶部1/2秒),并仅在用户选择时加载文件的详细信息。
var items = _driveService.Files.List();

items.Q = string.Format("'{0}' in parents and trashed = false", folderId);
items.Fields = "items(id,title,fileSize,mimeType)";

var result = items.Execute().Items;