无法将类型'IEnumerable <xelement>'隐式转换为'bool'</xelement>

时间:2012-06-14 12:07:03

标签: c# .net linq compiler-errors linq-to-xml

我想找到具有具体attribute.value。

的Xelement attribute.value
string fatherName =  xmlNX.Descendants("Assembly")
                           .Where(child => child.Descendants("Component")
                               .Where(name => name.Attribute("name").Value==item))
                           .Select(el => (string)el.Attribute("name").Value); 

我如何获得attribute.value?这说什么是布尔?

EDITED 最初我有以下XML:

<Assembly name="1">
  <Assembly name="44" />
  <Assembly name="3">
     <Component name="2" />
  </Assembly>
  </Assembly>

我需要获取attribute.value,其子元素(XElement)具有一个expecific attribute.value 在这个例子中,我会得到字符串&#34; 3&#34;因为我正在搜索孩子的父母哪个属性。值==&#34; 2&#34;

2 个答案:

答案 0 :(得分:2)

由于嵌套Where子句的编写方式。

内部子句读取

child.Descendants("Component").Where(name => name.Attribute("name").Value==item)

此表达式的结果为IEnumerable<XElement>,因此外部子句读取

.Where(child => /* an IEnumerable<XElement> */)

但是Where需要Func<XElement, bool>类型的参数,在这里你最终传入Func<XElement, IEnumerable<XElement>> - 因此错误。

我没有提供更正版本,因为您的意图根本不清楚给定的代码,请相应地更新问题。

<强>更新

看起来你想要这样的东西:

xmlNX.Descendants("Assembly")
     // filter assemblies down to those that have a matching component
     .Where(asm => asm.Children("Component")
                     .Any(c => c.name.Attribute("name").Value==item))
     // select each matching assembly's name
     .Select(asm => (string)asm.Attribute("name").Value)
     // and get the first result, or null if the search was unsuccessful
     .FirstOrDefault();

答案 1 :(得分:1)

我想你想要

string fatherName =  xmlNX.Descendants("Assembly")
                           .Where(child => child.Elements("Component").Any(c => (string)c.Attribute("name") == item))
                           .Select(el => (string)el.Attribute("name")).FirstOrDefault();