【问题标题】:Sharepoint 2010: Programatically adding documents to large librarySharepoint 2010:以编程方式将文档添加到大型库
【发布时间】:2013-04-13 10:08:39
【问题描述】:

我们有一个系统,可以使用 Web 界面将文档上传到 SharePoint 库。我正在使用客户端 API 完成此操作。具体来说,我使用 SaveBinaryDirect 上传文档,然后使用 CAML 查询检索文档,以便可以设置元数据列。 CAML 查询基于 FileLeafRef 字段检索文档,该字段填充了已上传文档的文件名。

问题在于,SharePoint 规定了从任何查询返回的最大限制为 5000 个项目,因此一旦文档库增长到 5000 个项目,CAML 查询将不再起作用。 (尽管它只返回单个文档,但显然需要扫描整个库)

我已经调查了索引列,但显然您无法索引 FileLeafRef,而且它似乎是唯一在上传时立即填充文档名称的字段。 我已经通过将项目限制从 5000 增加到 10000 来推迟这个问题,但是我们即将遇到这个新限制,人们开始报告间歇性的性能问题。

有什么方法可以通过客户端 API 上传文档并设置其元数据而不会超出最大项目限制?

【问题讨论】:

  • 您可以尝试看看使用连接器是否有任何性能优势。例如bendsoft.com/net-sharepoint-connector。此类工具旨在处理像您这样的情况。
  • 而且,如果第三方软件不是一个选项,请考虑发布您的一些 caml,以便我们可以看到您正在做什么样的选择。
  • 有趣的软件。你知道是否能够绕过提到的项目限制?
  • 它也应该处理这个问题,要么在选择中声明 LIMIT,要么在连接字符串中设置 DefaultLimit 参数,bendsoft.com/documentation/camelot-net-connector/latest/…

标签: sharepoint sharepoint-2010


【解决方案1】:

也许您可以创建另一个字段(文本字段)作为 FileLeafRef 的简单副本,然后为这个新字段编制索引?

【讨论】:

  • 不幸的是,复制 FileLeafRef 的行为需要读取相关字段,这会由于列表视图阈值而失败。
【解决方案2】:

通过不依赖 CAML 来定位文件解决了问题。相反,我使用的是不受项目限制的 GetFileByServerRelativeUrl。文件对象有一个名为 ListItemAllFields 的方法,它允许您查询和设置元数据。

如果需要返回具有文件名以外条件的项目,上述方法将允许最初设置元数据,从而可以存储和索引满足查询所需的任何条件。

如果需要根据未编入索引或无法编入索引的条件来查询大型列表,那么解决方案似乎涉及使用 ContentIterator 对象以小批量方式吐出列表。但这似乎不适用于 Client API,所以我不知道您应该如何以编程方式处理大型列表。

【讨论】:

    最近更新 更多