0

我正在尝试Lists.GetListItems使用 CAML 查询进行调用。当我不包含查询参数时它工作正常,但是当我包含查询时出现超时错误。假设我的网络服务被调用TestWebService,代码是:

    public static void GetListItemsTest()
    {
        try
        {
            string listName = "TestList";
            string[] fields = { "ID", "Title" };
            string queryStr =
                       "<GroupBy collapse='true'>" +
                          "<FieldRef Name='" + fields[1] + "' />" +
                       "</GroupBy>" +
                       "<OrderBy>" +
                          "<FieldRef Name='ID' Ascending='False' />" +
                       "</OrderBy>";
            XmlDocument xmlDoc = new System.Xml.XmlDocument();
            XmlElement query = xmlDoc.CreateElement("Query");
            XmlElement viewFields = xmlDoc.CreateElement("ViewFields");
            query.InnerXml = queryStr;
            viewFields.InnerXml = "";
            TestWebService.Lists lists = new TestWebService.Lists();
            lists.Url = "http://wss/sites/TestWebService/_vti_bin/lists.asmx";
            lists.Credentials = System.Net.CredentialCache.DefaultCredentials;
            XmlNode responseNode = lists.GetListItems(listName, null, query, viewFields, "1000000", null, null);
            Console.WriteLine("ran successfully");

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        finally
        {
            Console.ReadLine();
        }

    }

调用GetListItems挂起,然后抛出带有消息“操作已超时”的 WebException。如果我将query.InnerXml作业更改为:

query.InnerXml="";

然后GetListItems成功返回responseNode. 所以它必须与 CAML 查询片段有关。

经过进一步调查,我发现该GroupBy元素是问题的根源;OrderBy注释掉元素,查询超时,注释掉GroupBy元素,查询成功。我想知道是否GroupBy无法处理大型数据集,或者处理速度太慢;这个集合大约有 20,000 个元素,每个 Title 值的重复项一般不超过 5 或 6 个。LINQ 会更适用于这种情况吗?或者有没有办法用直接的 CAML 来做到这一点?

4

1 回答 1

1

在 SharePoint 2010 系统上有 20,000 个项目时,您可能会遇到SPQueryThrottledException的风险。一个典型用户限制为 5000 个,少数特权用户限制为 20,000 个查询返回的项目。

您是否在 Title 列上设置了索引?这可能会提高 GroupBy 的性能。否则我怀疑查询会强制检索所有项目,然后将它们分组。尝试将它们分组,并在页面中检索它们,而不是一次全部检索。

我不知道它是否完全相关,但我只是写了关于大型列表查询的博客。

于 2012-07-13T16:15:05.233 回答