如何修复我的linq查询

时间:2010-07-20 21:38:11

标签: c# linq linq-to-xml

以下是示例XML

<?xml version="1.0" encoding="utf-8" ?>
<Instructions>
  <Instruction>
    <Brand>Brand1</Brand>
    <Text>
      this is text for Brand1
    </Text>
  </Instruction>
  <Instruction>
    <Brand>Brand2</Brand>
    <Text>
      Brand2 text is slightly different
    </Text>
  </Instruction>
  <Instruction>
    <Brand>Brand3</Brand>
    <Text>
      Brand3 has boring text
    </Text>
  </Instruction>
  <Instruction>
    <Brand>Brand4</Brand>
    <Text>
      Brand4 had long text until the editor got hold of this file
    </Text>
  </Instruction>
</Instructions>

我的代码是:

string WhoAmI = "Brand1";
string t =
              (from Instruction in xmlDoc.Descendants("Instruction")
               where (string)Instruction.Element("Brand").Value == WhoAmI
               select t = Instruction.Element("Text").Value
               ).ToString();

//end code
总是

  

System.Linq.Enumerable + WhereSelectEnumerableIterator`2   [System.Xml.Linq.XElement,System.String]

不是

  

这是Brand1的文字

我做错了什么?

4 个答案:

答案 0 :(得分:2)

LINQ语句返回一系列值,而不是单个值。因此,在序列对象上调用.ToString()通常不会给你任何特别有用的东西。

在这种情况下,您的语句返回一个序列,其中包含一个值,但仍然是一个序列。所以你需要编写一个只返回一个值的LINQ语句:

string t = (from ... select ...).First();

这里要考虑其他含义,如果序列为空,First()将抛出异常。 FirstOrDefault()将返回null。

答案 1 :(得分:0)

尝试将ToString()替换为FirstOrDefault()

答案 2 :(得分:0)

此查询将返回一系列字符串而不是单个字符串。所以.ToString()方法调用将是IEnumerable ToString方法。

如果您确信查询将始终只返回1个字符串,则可以使用Single()或SingleOrDefault()方法返回字符串。

string WhoAmI = "Brand1"; 
string t = 
              (from Instruction in xmlDoc.Descendants("Instruction") 
               where (string)Instruction.Element("Brand").Value == WhoAmI 
               select t = Instruction.Element("Text").Value 
               ).SingleOrDefault();

答案 3 :(得分:0)

这将为您提供Text节点包含的文本值的集合。但是,如果缺少Text节点或Brand节点,则此查询将失败。您发布的代码所做的是不接受收集的结果;您正在将返回的集合对象转换为字符串,默认情况下,该字符串仅为您提供对象的名称。

您需要遍历查询返回的列表,以便对返回的多个值执行一些有用的操作...

        var results = (from e in doc.Descendants("Instruction")
                       where e.Descendants("Brand").First().Value == WhoAmI
                       select e.Descendants("Text").First().Value).ToList();