21

我正在使用 caml 查询来选择用户修改或添加的所有文档。查询在指定网站集的所有子网站上递归运行。

现在的问题是我无法摆脱也是结果集一部分的文件夹。现在我正在从结果数据表中过滤它们。但我想知道:是否可以仅使用 caml 从结果集中过滤掉文件夹?

4

8 回答 8

28

这个 CAML 实际上可以解决问题:

<Where>
    <Eq>
        <FieldRef Name='FSObjType' />
        <Value Type='Integer'>0</Value>
    </Eq>
</Where>

那不会给你任何文件夹。

于 2009-09-03T14:54:16.153 回答
13

所以,我想通了 :) 您可以在 caml 查询中使用 FieldRef='ContentType' 并指定要从选择中选择或排除的内容类型的类型。

所以就我而言,我已将此条件添加到我的 caml 表达式中:

<Neq><FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value></Neq>

注意:多语言设置存在问题。内容类型的名称可以不同,所以最好从资源中获取内容类型的名称

更新:

看来我的假设太快了。我需要根据文件夹内容类型过滤掉所有内容类型,因为在我们的项目中使用了这样的内容类型:(

我无法在 caml 中创建可行的查询,因此我将视图字段元素添加到我的查询中,该元素选择列表项的 ContentTypeId,并过滤掉基于文件夹内容类型的行。

执行此操作的代码微不足道,但让我感到困扰的是,纯 caml 无法完成如此简单的任务。

于 2008-12-02T10:35:59.630 回答
5

如果您正在使用文件夹并且您正在使用 SPQuery 对象,您可能还希望使用 ViewAttributes 字段来允许递归项目检索。将该值设置为 Scope="Recursive" 将从子文件夹中检索项目,并且不会检索结果集中的文件夹对象。

myQuery.ViewAttributes = "Scope=\"Recursive\"";
于 2010-04-22T14:42:10.717 回答
5

根据CAML Designer的输出(由 Karine Bosch 和 Andy Van Steenbergen 创建并由 Belux 信息工作者用户组分发),正确的 CAML 语法是:

<Where>
  <Eq>
    <FieldRef Name='FSObjType' />
    <Value Type='Integer'>0</Value>
  </Eq>
</Where>
<QueryOptions>
  <ViewAttributes Scope='RecursiveAll' />
</QueryOptions>

我在 PowerShell 中对此进行了测试并得到了预期的结果:

$qry = new-object Microsoft.SharePoint.SPQuery
$qry.Query = "<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq></Where><QueryOptions><ViewAttributes Scope='RecursiveAll' /></QueryOptions>"

$items = $lib.GetItems($qry)
$items.Count

如果您愿意,可以将 CAML 中的标记替换<QueryOptions>为 SPQuery 对象属性 ViewAttributes,即$qry.ViewAttributes = “Scope=’RecursiveAll’".

测试时,请确保每次都重新实例化 SPQuery 对象,因为您不能简单地重新分配 Query 属性。执行查询后,将忽略分配给 Query 属性的任何新值。所以执行整个 PowerShell 片段。

于 2013-05-14T03:49:21.077 回答
2

戴夫 T. 的回答对我不起作用,但以此为灵感,这就是我想出的:

<Where>
  <BeginsWith><FieldRef Name="ContentTypeId" />
    <Value Type="ContentTypeId">0x0101</Value>
  </BeginsWith>
</Where>

主要问题是我们只能在站点级别知道 ContentTypeId,因为当将内容类型添加到列表/库时,它会变成列表内容类型,并且其 ID 会附加另一个 GUID (0x010100 ...)。并且 CAML 中没有 NotBeginsWith条件,因此我们无法过滤掉文件夹,但我们只能包含站点内容类型 id 为0x0101的文档。

具有FSObjType字段的解决方案对我不起作用,因为我的库中的文件远多于阈值,因此必须对查询中的所有字段进行索引,而我还没有找到索引该字段的方法。

于 2016-12-01T08:58:34.807 回答
0

这对我有用

   <Where>
      <Eq>
         <FieldRef Name='FSObjType' />
         <Value Type='Number'>1</Value>
      </Eq>
   </Where>
于 2010-07-29T21:43:03.823 回答
0

检查我的其他答案CAML 查询,其中包括结果集中的文件夹

简单地改变运营商可能会得到你所需要的

<Where>
  <NotIncludes>
    <FieldRef Name='ContentTypeId' />
    <Value Type='ContentTypeId'>0x0120</Value>
  </NotIncludes>
</Where>

我不确定这是否可行。

于 2011-12-22T16:04:12.977 回答
0

对我来说,它的工作方式如下: -

<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where>
于 2016-02-09T08:59:05.097 回答