CAML查询:如何从结果集中过滤文件夹?

时间:2008-12-02 08:22:20

标签: sharepoint caml

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

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

8 个答案:

答案 0 :(得分:24)

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

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

不会给你任何文件夹。

答案 1 :(得分:12)

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

所以在我的情况下,我已经将这个条件添加到我的caml表达式中:

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

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

更新:

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

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

执行此操作的代码是微不足道的,但令我困扰的是,纯粹的caml无法完成这样简单的任务。

答案 2 :(得分:5)

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

myQuery.ViewAttributes = "Scope=\"Recursive\"";

答案 3 :(得分: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

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

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

答案 4 :(得分:2)

Dave T.'s answer对我不起作用,但把它作为灵感来源于我的想法:

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

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

FSObjType 字段的解决方案对我不起作用,因为我的库文件远远多于阈值,所以查询中的所有字段都必须编入索引,我还没找到方法索引这个字段。

答案 5 :(得分:0)

这对我有用

   <Where>
      <Eq>
         <FieldRef Name='FSObjType' />
         <Value Type='Number'>1</Value>
      </Eq>
   </Where>

答案 6 :(得分:0)

检查我的其他答案CAML query that includes folders in result set

只需更改操作符即可获得所需

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

我不确定这是否有用。

答案 7 :(得分:0)

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

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