2012-07-11 2 views
0

Lists.GetListItems을 CAML 쿼리로 호출하려고합니다. 쿼리 매개 변수를 포함하지 않아도 제대로 작동하지만 쿼리를 포함하면 시간 초과 오류가 발생합니다. 내 웹 서비스가 TestWebService라고 가정하면, 코드는 다음과 같습니다 GetListItems 중지에 대한 호출은 다음 메시지와 함께 WebException이를 throw 쿼리를 포함하면 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(); 
     } 

    } 

는 "작업은 시간이 초과되었습니다." 나는에 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

관련 문제