我正在使用Caml查询,选择由用户修改或添加的所有文档。查询在指定网站集的所有子站点上递归运行。
现在问题是我无法摆脱结果集中也包含的文件夹。目前,我从结果数据表中过滤它们。但是我想知道:是否可能仅通过使用Caml来过滤掉结果集中的文件夹?
我正在使用Caml查询,选择由用户修改或添加的所有文档。查询在指定网站集的所有子站点上递归运行。
现在问题是我无法摆脱结果集中也包含的文件夹。目前,我从结果数据表中过滤它们。但是我想知道:是否可能仅通过使用Caml来过滤掉结果集中的文件夹?
这个CAML确实有用:
<Where>
<Eq>
<FieldRef Name='FSObjType' />
<Value Type='Integer'>0</Value>
</Eq>
</Where>
这不会为你提供任何文件夹。
所以,我想通了 :) 您可以在caml查询中使用FieldRef='ContentType',并指定要选择或从选择中排除的内容类型。
所以在我的情况下,我已经将这个条件添加到我的caml表达式中:
<Neq><FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value></Neq>
注意: 在多语言设置中存在问题。内容类型的名称可能不同,因此最好从资源中获取内容类型的名称。
更新:
看来我太急于做出假设了。我需要基于文件夹内容类型过滤掉所有内容类型,因为在我们的项目中使用了这样的内容类型 :(
我无法在caml中创建可工作的查询,因此我将视图字段元素添加到我的查询中,该元素选择列表项的ContentTypeId,并过滤掉基于文件夹内容类型的行。
执行此操作的代码很简单,但令人困扰的是,如此简单的任务不能通过纯caml完成。
$filter=FSObjType eq 0
的 REST 调用失败了。ContentTypeId 可以工作,但看起来像是 hack。 - nawfal<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
myQuery.ViewAttributes = "Scope=\"Recursive\"";
Dave T.的回答对我没有用,但是以此为灵感,我想到了以下解决方法:
<Where>
<BeginsWith><FieldRef Name="ContentTypeId" />
<Value Type="ContentTypeId">0x0101</Value>
</BeginsWith>
</Where>
对我来说,下面的方法也起作用:
<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where>
这是对我有效的方法
<Where>
<Eq>
<FieldRef Name='FSObjType' />
<Value Type='Number'>1</Value>
</Eq>
</Where>
查看我的其他答案包括结果集的文件夹的CAML查询
简单地更改运算符可能会得到你所需要的东西
<Where>
<NotIncludes>
<FieldRef Name='ContentTypeId' />
<Value Type='ContentTypeId'>0x0120</Value>
</NotIncludes>
</Where>
我不确定那会不会起作用。