2012-06-11 6 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 представляет собой совокупность потомков, затем вы их фильтруете и вытягиваете дальнейших потомков из любого, проходящего через фильтр.

Даже если ваш фильтр соответствует только одному элементу, система по-прежнему будет рассматривать его как коллекцию. Если вы знаете, что там будет только один результат, то вы можете использовать метод .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

большое спасибо :) –

Смежные вопросы