caml查询以查询包含文档集内部的文件

时间:2015-04-30 19:20:08

标签: c# sharepoint sharepoint-2013 csom

我想使用CSOM为1个特定文件检索1列,这些列可以位于任何位置,因此在任何文件夹类型的内容类型中都包括文档集。

所以...我可以先检查,然后......如果结果= 0,然后遍历文件夹并查看其中一个父项是否是文档集...然后再进行检查但是我想知道是否在lib和内容类型(例如文档集)中查询"没有更方便的方法,只要它是文件"

以下代码有效,但如果文件位于文档集中,则....将无效。

                   var baseUrl = uri.GetLeftPart(UriPartial.Authority);
                    var fileServerRelativeUrl = uri.ToString().Replace(baseUrl, string.Empty);
                    logger.Log(LogLevel.Debug, " fileserverrelativeurl is " + fileServerRelativeUrl.ToString());
                    var file = context.Web.GetFileByServerRelativeUrl(fileServerRelativeUrl);                   

                    List list = file.ListItemAllFields.ParentList;
                    context.Load(list);
                    context.ExecuteQuery();
                    logger.Log(LogLevel.Debug, " list is loaded: " + list.Title.ToString());

                    CamlQuery camlQuery = new CamlQuery();
                    camlQuery.ViewXml =
                        "<View><Query><Where><Eq><FieldRef Name='" + fieldRefName + "'/>" +
                        "<Value Type='Text'>" + fieldRefValue + "</Value></Eq></Where>" +
                        "<RowLimit>1</RowLimit></Query></View>";
                    logger.Log(LogLevel.Debug, " caml is " + camlQuery.ViewXml.ToString());

                    ListItemCollection listItems = list.GetItems(camlQuery);
                    context.Load(listItems);
                    try
                    {
                        context.ExecuteQuery();
                    }
                    catch
                    {
                        logger.Log(LogLevel.Debug, " caml exec FAILED !! ");
                        // e.g. : no access or the listname as incorrectly deduced
                        throw;
                    }
                    logger.Log(LogLevel.Debug, " items found: " + listItems.Count.ToString());
                    // and now retrieve the items needed
                    if (listItems.Count == 1)
                    {
                        logger.Log(LogLevel.Debug, " listitem found ");
                        ListItem item = listItems[0];
                        foreach (string column in columns)
                        {
                            if (item.FieldValues.ContainsKey(column))
                            {
                                logger.Log(LogLevel.Debug, " column found: " + column);

                                if (item[column] is Dictionary<string, object>)
                                {
                                    Dictionary<string, object> clientTaxonomyObject = item[column] as
                                        Dictionary<string, object>;
                                    if (clientTaxonomyObject.ContainsKey("_ObjectType_") &&
                                        clientTaxonomyObject.ContainsKey("TermGuid") &&
                                        clientTaxonomyObject.ContainsKey("Label") &&
                                        clientTaxonomyObject["_ObjectType_"].Equals("SP.Taxonomy.TaxonomyFieldValue"))
                                    {
                                        values.Add(column, clientTaxonomyObject["Label"].ToString());
                                    }
                                    else
                                    {
                                        values.Add(column, item[column].ToString());
                                    }

                                }
                                else
                                {
                                    values.Add(column, "");
                                }
                            }
                        }
                    }
                }

REF

更新

啊!更简单的是,根本不需要caml查询file.listitemallfields然后只是转储该字段的分类标签。解决了:))

1 个答案:

答案 0 :(得分:0)

使用

代替使用CAML查询,可以更轻松地完成
   listitem li = file.listitemallfields;
   context.load(li)
   context.ExecuteQuery();

直接例如的Li [&#34;无论&#34;]