2012-06-11 66 views
2

我收到以下錯誤:LINQ的 - 無法隱式轉換類型 '的IEnumerable <IEnumerable的<.XElement>>' 到 'IEnumerable的<.XElement>'

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>>' to 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>'. An explicit conversion exists (are you missing a cast?) 

而且我不明白爲什麼。在這裏,你有我的代碼,我試圖讓DataContainer元素將Name屬性的相同name.key

XDocument xml = XDocument.Load(name.Value); 
IEnumerable<XElement> columns = from d in xml.Descendants("DataContainer") 
         where (d.Attribute("Name").Value.Equals(name.Key)) 
         select d.Descendants("ArrayOfColumn"); 

在這裏你有我的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<DataContainers> 
    <DataContainer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="IRS vs E3M" Currency="EUR"> 
     <ArrayOfColumn Name="Maturite" isData="false"> 
      <Line Value="1Y" /> 
      <Line Value="2Y" /> 
      <Line Value="3Y" /> 
      <Line Value="4Y" /> 
      <Line Value="5Y" /> 
      <Line Value="6Y" /> 
      <Line Value="7Y" /> 
      <Line Value="8Y" /> 
      <Line Value="9Y" /> 
      <Line Value="10Y" /> 
      <Line Value="15Y" /> 
      <Line Value="20Y" /> 
      <Line Value="30Y" /> 
      <Line Value="40Y" /> 
      <Line Value="50Y" /> 
      <Line Value="60Y" /> 
     </ArrayOfColumn> 
     <ArrayOfColumn Name="Value" isData="true"> 
      <Line Value="EURAB3E1Y" /> 
      <Line Value="EURAB3E2Y" /> 
      <Line Value="EURAB3E3Y" /> 
      <Line Value="EURAB3E4Y" /> 
      <Line Value="EURAB3E5Y" /> 
      <Line Value="EURAB3E6Y" /> 
      <Line Value="EURAB3E7Y" /> 
      <Line Value="EURAB3E8Y" /> 
      <Line Value="EURAB3E9Y" /> 
      <Line Value="EURAB3E10Y" /> 
      <Line Value="EURAB3E15Y" /> 
      <Line Value="EURAB3E20Y" /> 
      <Line Value="EURAB3E30Y" /> 
      <Line Value="EURAB3E40Y" /> 
      <Line Value="EURAB3E50Y" /> 
      <Line Value="EURAB6E60Y" /> 
     </ArrayOfColumn> 
    </DataContainer> 
</DataContainers> 

有人能幫助我,解釋爲什麼請?

回答

5

問題是您的d是後代的集合,那麼您正在對它們進行過濾並從通過過濾器的任何內容中抽取更多後代。

即使您的過濾器只匹配一個元素,系統仍會將其視爲一個集合。如果你知道,只會有一個結果,那麼你可以在d拉後裔之前使用.Single()方法,例如:

XDocument xml = XDocument.Load(name.Value); 
IEnumerable<XElement> columns = xml.Descendants("DataContainer") 
            .Where(d => d.Attribute("Name").Value.Equals(name.Key)) 
            .Single() 
            .Select(d => d.Descendants("ArrayOfColumn")); 

,因爲它流動爲了這個美好的,我把它改爲方法鏈接。還要注意where表達式可以放在單個方法中,但是這更清晰。

+0

非常感謝:) –

相關問題