2012-01-13 117 views
0

我有以下的XML,我需要deserialise一個對象:如何優化這個LINQ查詢?

<animals> 
     <retrive>true</retrive>    
     <collection> 
     <cat>big</cat> 
     <dog>spot</dog> 
     <vetName>John Smith</vetName>    
     </collection> 
    </animals> 

這是使用LINQ我嘗試:

private Animal GetAnimalFromXML(string xml) 
{ 
    var tempdata = (from c in data.Elements("collection") 
           select new 
           { 
            Cat = (string)c.Element("cat"), 
            Dog = (string)c.Element("dog"), 
            VetName = (string)c.Element("vetName"), 
           }).First(); 

    return new Animal(){ 
     Cat = tempdata.Cat, 
     Dog = tempdata.Dog, 
     VetName = tempdata.VetName 
    } 
} 

我不喜歡,我不得不使用一個臨時對象所以我想知道是否有可能解決這個問題,並減少這種方法只是一個單一的查詢?

謝謝, d。

+0

這是不是當你想到只有一個_collection_元素使用第一種方法好主意。更好的方法是使用Single並處理其結果。 – 2012-01-13 11:23:34

+0

@Petr - 你怎麼知道集合只有1個元素? Perheps的要求是「從集合中取出第一條記錄」。 – Jamiec 2012-01-13 13:27:14

+0

@Jamiec我想,因爲第一個方法是在整個變換集合上調用而不是在原始_collection_元素上。如果需要從多個選項中選擇第一個_collection_,選擇第一個集合並在此之後進行轉換才更爲有效。 – 2012-01-13 13:57:27

回答

7

沒有必要使用臨時數據

private Animal GetAnimalFromXML(string xml) 
{ 
    return (from c in data.Elements("collection") 
      select new Animal() 
         { 
          Cat = (string)c.Element("cat"), 
          Dog = (string)c.Element("dog"), 
          VetName = (string)c.Element("vetName"), 
         }).First(); 

}