【问题标题】:caml query to query for a file including inside a document setcaml 查询以查询包含在文档集中的文件
【发布时间】:2015-04-30 19:20:07
【问题描述】:

我想使用 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, "");
                                }
                            }
                        }
                    }
                }

参考

更新

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

【问题讨论】:

    标签: c# sharepoint sharepoint-2013 csom


    【解决方案1】:

    不使用 CAML 查询,使用它可以更轻松地完成

       listitem li = file.listitemallfields;
       context.load(li)
       context.ExecuteQuery();
    

    这直接给出例如li[“随便”]

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 2022-01-17
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多