0

Lists.GetListItemsCAML クエリで呼び出そうとしています。クエリ パラメータを含めない場合は問題なく動作しますが、クエリを含めるとタイムアウト エラーが発生します。私のWebサービスが呼び出されたと仮定すると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アイテムに制限されています。

タイトル列にインデックスを設定しましたか?これにより、GroupByのパフォーマンスが向上する可能性があります。それ以外の場合は、クエリによってすべてのアイテムが強制的に取得され、グループ化されると思われます。それらをグループ化して、一度にすべてではなく、ページで取得してみてください。

それが完全に関連していることはわかりませんが、大きなリストのクエリについてブログを書いただけです。

于 2012-07-13T16:15:05.233 に答える