包含结果集中文件夹的CAML查询

Rex*_*x M 11 sharepoint caml spquery

我试图写一个CAML查询执行针对特定SPList,范围限定于特定的文件夹,从该点递归,并返回所有listItems中(其中符合标准)和文件夹.

这是查询的代码,它似乎应该工作(格式化为可读性):

SPQuery query = new SPQuery();
query.Query = "
<Where>
    <Or>
        <Contains>
            <FieldRef Name=\"FileRef\" />
            <Value Type=\"Text\">foo</Value>
        </Contains>
        <Eq>
            <FieldRef Name=\"FSObjType\" />
            <Value Type=\"Lookup\">1</Value>
        </Eq>
    </Or>
</Where>";

query.ViewFields = "
<FieldRef Name=\"CustomField1\" Nullable=\"TRUE\" />
<FieldRef Name=\"CustomField2\" Nullable=\"TRUE\" />
<FieldRef Name=\"CustomField3\" Nullable=\"TRUE\" />
";

query.RowLimit = 500;
query.ViewAttributes = "Scope=\"RecursiveAll\"";
query.Folder = startingFolder;
DataTable dt = myList.GetItems(query).GetDataTable();
Run Code Online (Sandbox Code Playgroud)

所以 - 这只返回ListItems - 没有文件夹.

如果我从查询中删除其他条件,只留下FSObjType=1,我得到一个COM异常"无法完成此操作.请再试一次."

如果我然后删除ViewFields,只留下Scope=RecursiveAllFSObjType=1,我得到一个空的结果集.

Dav*_* T. 14

每个人都很亲密,但不是很正确.

using (SPSite site = new SPSite("http://server/site"))
{
  SPWeb web = site.RootWeb; // See disposal guidance http://blogs.msdn.com/b/rogerla/archive/2008/10/04/updated-spsite-rootweb-dispose-guidance.aspx

  SPQuery query = new SPQuery();
  query.Query = @"
          <Where>
            <BeginsWith>
              <FieldRef Name='ContentTypeId' />
              <Value Type='ContentTypeId'>0x0120</Value>
            </BeginsWith>
          </Where>";
  query.ViewAttributes = "Scope='RecursiveAll'";
  SPList list = web.Lists[listId];
  SPListItemCollection items = list.GetItems(query);
  // Do stuff with your folders
}
Run Code Online (Sandbox Code Playgroud)

首先,使用此FieldRef是错误的:

<FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value>
Run Code Online (Sandbox Code Playgroud)

因为文件夹内容类型可以继承.因此,您需要与内容类型ID进行比较,如下所示:

<Where>
  <BeginsWith>
    <FieldRef Name='ContentTypeId' />
    <Value Type='ContentTypeId'>0x0120</Value>
  </BeginsWith>
</Where>
Run Code Online (Sandbox Code Playgroud)

然后,将视图属性Scope设置为RecursiveAll

<View Scope='RecursiveAll'>...</View>
Run Code Online (Sandbox Code Playgroud)

那应该返回内容类型继承自Folder的任何项目(0x0120)


gn2*_*n22 5

我没有我的开发图像来测试,所以我可能需要稍后修改它; 但我想你可以试试

query.ViewAttributes = "Scope=\"Recursive\""; 
Run Code Online (Sandbox Code Playgroud)

检索项目将允许您使用SPUtility.GetUrlDirectory(url)获取给定项目的文件夹路径,并从那里解析文件夹层次结构.


小智 5

您可以尝试将您的caml查询基于文件夹内容类型,

<FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value>
Run Code Online (Sandbox Code Playgroud)

同时保持

Query.ViewAttributes = "Scope=\"RecursiveAll\""; 
Run Code Online (Sandbox Code Playgroud)