Как мне исправить мой запрос linq - PullRequest
0 голосов
/ 21 июля 2010

Вот пример 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 ]

2 голосов
/ 21 июля 2010

Оператор LINQ возвращает последовательность значений, а не одно значение.Поэтому вызов .ToString() для объекта последовательности, как правило, не даст вам ничего особенно полезного.

В этом случае ваш оператор возвращает последовательность с одним значением, но все же последовательность.Таким образом, вам нужно написать оператор LINQ, который возвращает только одно значение:

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

Здесь необходимо учесть и другие последствия, например, First() вызовет исключение, если последовательность пуста.FirstOrDefault() вернет ноль вместо.

0 голосов
/ 21 июля 2010

Это даст вам коллекцию содержащих текстовые значения текстовых узлов. Однако, если отсутствует узел Text или узел Brand, этот запрос не будет выполнен. То, что делал код, который вы опубликовали, не принимало коллекцию в результате; вы приводили объект коллекции, возвращенный к строке, которая по умолчанию дает вам только имя объекта.

Вам нужно будет перебрать список, возвращаемый запросом, чтобы сделать что-то полезное с возвращенными множественными значениями ...

        var results = (from e in doc.Descendants("Instruction")
                       where e.Descendants("Brand").First().Value == WhoAmI
                       select e.Descendants("Text").First().Value).ToList();
0 голосов
/ 21 июля 2010

Этот запрос вернет последовательность строк, а не одну строку. Таким образом, вызов метода .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();
0 голосов
/ 21 июля 2010

Попробуйте заменить ToString() на FirstOrDefault()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...