2012-07-11 91 views
0

我試圖用CAML查詢調用Lists.GetListItems。當我不包含查詢參數時它工作正常,但是當我包含查詢時會出現超時錯誤。假設我的web服務被稱爲TestWebService,代碼爲:當我包含查詢時GetListItems超時

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來做到這一點?

回答

1

對於SharePoint 2010系統上的20,000個項目,您可能會冒險獲得SPQueryThrottledException。一個典型的用戶被限制爲5000個,並且一些特權用戶將被查詢返回到20,000個項目。

您是否在標題欄設置了索引?這可能會提高GroupBy的性能。否則,我懷疑查詢強制檢索所有項目,然後對它們進行分組。嘗試對它們進行分組,並以頁面方式檢索它們,而不是一次全部檢索。

我不知道它是完全相關的,但我只是在large lists上發表關於查詢的博客。

+0

該列表託管在SP2007上,如果有的話。檢索頁面中的項目非常耗時,每頁大約100個項目。現在我要嘗試整理沒有分組的列表,然後使用LINQ進行分組和排序。 – sigil 2012-07-13 22:01:30