2012-06-11 4 views
2

Je reçois l'erreur suivante:LINQ - Impossible de convertir implicitement le type '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?) 

et je ne comprends pas pourquoi. Ici vous avez mon code où je tente d'obtenir l'élément DataContainer que le même son attribut Name est comme 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"); 

Et là, vous avez mon fichier 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> 

Quelqu'un peut me aider et expliquer pourquoi s'il vous plait?

Répondre

5

Le problème est que votre d est une collection de descendants, alors vous les filtrez et vous tirez les descendants de ceux qui traversent le filtre.

Même si votre filtre ne correspond qu'à un élément, le système le traitera toujours comme une collection. Si vous savez qu'il n'y aura qu'un seul résultat, vous pouvez utiliser la méthode .Single() sur d avant de tirer les descendants., Par exemple .:

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")); 

Je l'ai changé pour le chainage des méthodes qu'il coule mieux pour cela. Notez aussi que l'expression where peut être mise dans la méthode unique, mais c'est plus clair à regarder.

+0

merci beaucoup :) –

Questions connexes