Lists.GetListItems
CAML クエリで呼び出そうとしています。クエリ パラメータを含めない場合は問題なく動作しますが、クエリを含めるとタイムアウト エラーが発生します。私の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 でこれを行う方法はありますか?