2012-05-05 73 views
1

這個作品,但速度很慢,簡單的LINQ to XML查詢將行不通

[System.Web.Script.Services.ScriptMethod()] 
[System.Web.Services.WebMethod] 
public static List<string> GetNames(string prefixText, int count) 
{ 
    XmlDocument xmlArtist = new XmlDocument(); 
    xmlArtist.Load(string.Format(" http://ws.audioscrobbler.com/2.0/?method=chart.gettopartists&api_key={0}&limit=100", key)); 
    List<string> topartists = new List<string>(); 
    foreach (XmlNode node in xmlArtist.SelectNodes("lfm/artists/artist")) 
    { 
     string a = node.SelectSingleNode("name").InnerText.ToString(); 
     if (a.Contains(prefixText)) 
     { 
      topartists.Add(a); 
     } 

    } 

    return topartists; 

我希望把它轉換成一個LINQ查詢,以加快速度,我還沒有在使用了一段時間LINQ和過看了很多例子,並不知道爲什麼這不起作用。

 [System.Web.Script.Services.ScriptMethod()] 
[System.Web.Services.WebMethod] 
public static List<string> GetNames(string prefixText, int count) 
{ 
    List<string> topartists = new List<string>(); 
    XElement element = XElement.Load("http://ws.audioscrobbler.com/2.0/?method=chart.gettopartists&api_key=...&limit=100"); 
    IEnumerable<XElement> artists = 
    from el in element.Elements("artist") 
    where el.Element("name").Value.Contains(prefixText) 
    select el; 
    foreach (XElement el in artists) 
     topartists.Add(el.Value); 
    return topartists; 

這是XML的一部分,我已經有工作:

<lfm status="ok"> 
    <artists page="1" perPage="100" totalPages="10" total="1000"> 
    <artist> 
    <name>Coldplay</name> 
    <playcount>849564</playcount> 
    <listeners>124389</listeners> 
    <mbid>cc197bad-dc9c-440d-a5b5-d52ba2e14234</mbid> 
    <url>http://www.last.fm/music/Coldplay</url> 
    <streamable>1</streamable> 
    <image size="small">http://userserve-ak.last.fm/serve/34/214667.png</image> 
    <image size="medium">http://userserve-ak.last.fm/serve/64/214667.png</image> 
    <image size="large">http://userserve-ak.last.fm/serve/126/214667.png</image> 
    <image size="extralarge">http://userserve-ak.last.fm/serve/252/214667.png</image> 
    <image size="mega">http://userserve-ak.last.fm/serve/_/214667/Coldplay.png</image> 
    </artist> 
     <artist> 
     <name>Radiohead</name> 
     <playcount>960812</playcount> 
     <listeners>104849</listeners> 
     <mbid>a74b1b7f-71a5-4011-9441-d0b5e4122711</mbid> 
     <url>http://www.last.fm/music/Radiohead</url> 
     <streamable>1</streamable> 
     <image size="small">http://userserve-ak.last.fm/serve/34/24688757.png</image> 
     <image size="medium">http://userserve-ak.last.fm/serve/64/24688757.png</image> 
     <image size="large">http://userserve-ak.last.fm/serve/126/24688757.png</image> 
     <image size="extralarge">http://userserve-ak.last.fm/serve/252/24688757.png</image> 
     <image size="mega">http://userserve-ak.last.fm/serve/_/24688757/Radiohead.png</image> 
     </artist> 
     <artist> 

回答

1

Elements()只返回你的直接孩子,但你的根元素是lfm,所以你唯一的子元素是artists這不匹配「藝術家」 - 所以沒有匹配的元素。您可以修復您的查詢是這樣的:

IEnumerable<XElement> artists = 
    from el in element.Element("artists").Elements("artist") 
    where el.Element("name").Value.Contains(prefixText) 
    select el; 

我懷疑這的LINQ to XML查詢會比你以前的查詢,雖然,因爲它本質上是做同樣的工作要快得多。

+0

我看,謝謝,我嘗試過element.Element(「藝術家/藝術家」),但它不喜歡那樣, –

+0

另一種方法是使用element.Descendants(「artist」)中的el,性能會稍差 – BrokenGlass

+0

有沒有反正我可以暫時存儲這些數據,而不必每次都要求這個XML? LINQ也一樣慢。我無法從用於填充AutoCompleteExtender的此方法的靜態方法訪問會話狀態,Cookie或變量? –