Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sharepoint 在结果集中包含文件夹的CAML查询_Sharepoint_Caml_Spquery - Fatal编程技术网

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

Sharepoint 在结果集中包含文件夹的CAML查询,sharepoint,caml,spquery,Sharepoint,Caml,Spquery,我试图编写一个CAML查询,该查询针对特定的SPList执行,作用域为特定的文件夹,从该点开始递归,并返回所有ListItems(满足条件)和文件夹 下面是查询的代码,看起来应该可以运行(格式化为可读性): SPQuery query=new SPQuery(); query.query=” 福 1. "; query.ViewFields=” "; query.RowLimit=500; query.ViewAttributes=“Scope=\”RecursiveAll\”; query.F

我试图编写一个CAML查询,该查询针对特定的SPList执行,作用域为特定的文件夹,从该点开始递归,并返回所有ListItems(满足条件)和文件夹

下面是查询的代码,看起来应该可以运行(格式化为可读性):

SPQuery query=new SPQuery();
query.query=”
福
1.
";
query.ViewFields=”
";
query.RowLimit=500;
query.ViewAttributes=“Scope=\”RecursiveAll\”;
query.Folder=startingFolder;
DataTable dt=myList.GetItems(查询).GetDataTable();
所以-这只返回ListItems-没有文件夹

如果我从查询中删除其他条件,只保留
FSObjType=1
,则会出现COM异常“无法完成此操作。请重试”


如果随后删除视图字段,只留下
Scope=RecursiveAll
FSObjType=1
,我会得到一个空的结果集。

我没有要测试的dev映像,因此我可能需要稍后修改它;但我想你可以试试

query.ViewAttributes = "Scope=\"Recursive\""; 
检索项目将允许您使用
SPUtility.GetUrlDirectory(url)
获取给定项目的文件夹路径,并从中解析文件夹层次结构

如果我从查询中删除其他条件,只保留FSObjType=1,则会出现COM异常“无法完成此操作。请重试”

执行此操作时是否删除了
标记?否则,它将无法正常运行

无论如何,这并不能解决你的问题。您是否尝试过将查询留空?它还回什么吗


我一直在做类似的事情,也遇到了一个问题,也许这有点相关

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

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

我已经解决了这个问题:

<QueryOptions>
<IncludeAttachmentUrls>True</IncludeAttachmentUrls>
<Folder/> </QueryOptions>

真的
作为查询选项

我在stack overflow(堆栈溢出)上找到了我的问题:


在SP 2010中,这似乎仍然是一个问题。以下是适用于2007年或2010年的变通代码,基于使用web服务的代码:

private static SPListItem RecurseIntoFolders(SPList list, SPFolder parentFolder, string fileReference)
{
    var query = new SPQuery
    {
        Query = "<Where>" +
                "<Eq><FieldRef Name='FSObjType'/><Value Type='Lookup'>1</Value></Eq>" +
                "</Where>",
        ViewFields = String.Format("<FieldRef Name='{0}' />", FileReferenceInternalFieldName),
        ViewAttributes = "Scope='RecursiveAll'",
        Folder = parentFolder
    };

    var items = list.GetItems(query);
    if (items.Count == 0)
        return null;

    foreach (SPListItem item in items)
    {
        parentFolder = item.Folder;

        // TODO: Any other checking that this is the item we want

        return item;
    }
    return RecurseIntoFolders(list, parentFolder, fileReference);
}
私有静态SPListItem RecurseIntoFolders(SPList列表、SPFolder父文件夹、字符串文件引用)
{
var query=新的SPQuery
{
Query=“”+
"1" +
"",
ViewFields=String.Format(“,FileReferenceInternalFieldName),
ViewAttributes=“Scope='RecursiveAll'”,
文件夹=父文件夹
};
var items=list.GetItems(查询);
如果(items.Count==0)
返回null;
foreach(项目中的SPListItem项目)
{
parentFolder=item.Folder;
//TODO:是否有其他检查来确定这是我们想要的物品
退货项目;
}
返回RecurseIntoFolders(列表、父文件夹、文件引用);
}

每个人都很接近,但并不完全正确

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
}
使用(SPSite站点=新SPSite(“http://server/site"))
{
SPWeb web=site.RootWeb;//请参阅处置指南http://blogs.msdn.com/b/rogerla/archive/2008/10/04/updated-spsite-rootweb-dispose-guidance.aspx
SPQuery query=新建SPQuery();
query.query=@”
0x0120
";
query.viewtattributes=“Scope='RecursiveAll'”;
SPList list=web.Lists[listId];
SPListItemCollection items=list.GetItems(查询);
//处理你的文件夹
}
首先,使用此FieldRef是错误的:

<FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value>
文件夹
因为文件夹内容类型可以继承。因此,您需要与内容类型ID进行比较,如下所示:

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

0x0120
然后,将视图属性范围设置为RecursiveAll

<View Scope='RecursiveAll'>...</View>
。。。
它将返回其内容类型从文件夹(0x0120)继承的任何项目。

静态字符串GetParentFolder(SPListItemToFind,SPFolder Folder)
{ 
SPQuery query=新建SPQuery();
//query.query=“”;
query.query=“”+itemToFind.ID+”;
query.Folder=文件夹;
query.ViewAttributes=“Scope=\“Recursive\”;
SPListItemCollection items=itemToFind.ParentList.GetItems(查询);
int intpartentFolderID=0;
如果(items.Count>0)
{
foreach(项目中的SPListItem项目)
{
SPFile f=item.Web.GetFile(item.Url);
字符串test11=f.ParentFolder.Name;
intpartentFolderID=f.ParentFolder.Item.ID;
//字符串test1=item.File.ParentFolder.Name;
return(intpartentFolderID.ToString());
}
}
return(intpartentFolderID.ToString());
}  

“递归”深入搜索文件夹,但不在结果集中包含文件夹对象。我想在一次往返中获得所需的所有信息-在查询顶部进行几十次API调用并不理想。如果我可以问一下,您是否将此作为某些UI元素(例如可以使用延迟加载的树视图)的提供者?或者,您需要在一次传递中提取所有内容吗?@Gurdas需要一次性提取所有内容,我的所有CAML查询都是通过编程生成的,以避免语法错误,例如多余的
。这不是语法问题。如果将查询保留为空,是否会得到结果集?很抱歉,响应太晚。仅当我删除所有条件时,我才会获得项目的结果集。那么您是否获得指定文件夹中的所有项目?另外,您是否尝试将“FileRef”和“FSObjType”字段添加到视图部分?WSS的文档记录很差,而且非常不一致。哦,请确保运行此操作的视图设置了文件夹选项。很有趣。。。我试试看。空文件夹标签应该完成什么?它应该返回文件夹,但我现在记不起来了。SPList是一个非常复杂且晦涩难懂的Web服务,有时是神奇的…:)如果它不起作用,我会在这里检查我的文件。你有没有做过手术
<Where>
  <BeginsWith>
    <FieldRef Name='ContentTypeId' />
    <Value Type='ContentTypeId'>0x0120</Value>
  </BeginsWith>
</Where>
<View Scope='RecursiveAll'>...</View>
static string GetParentFolder(SPListItem itemToFind, SPFolder folder)  
    { 
        SPQuery query = new SPQuery(); 
       // query.Query =  "<OrderBy><FieldRef Name='Title'/></OrderBy>";
        query.Query = "<Where><Eq><FieldRef Name=\"ID\"/><Value Type=\"Integer\">"+ itemToFind.ID +"</Value></Eq></Where>";
        query.Folder = folder;
        query.ViewAttributes = "Scope=\"Recursive\"";
        SPListItemCollection items = itemToFind.ParentList.GetItems(query);
        int intpartentFolderID=0 ;
        if (items.Count > 0)
        {
        foreach (SPListItem item in items) 
        {

            SPFile f = item.Web.GetFile(item.Url);

            string test11 = f.ParentFolder.Name;
            intpartentFolderID = f.ParentFolder.Item.ID;

            //string test1 = item.File.ParentFolder.Name;

             return (intpartentFolderID.ToString()); 

         }
        }
        return (intpartentFolderID.ToString());     
    }