Выберите из XElement с оператором where, используя linq

У меня есть объект XElement, созданный из XML, который выглядит следующим образом:

<Root>
  <Oppurtunities>
    <Oppurtunity>
      <Title> Account Manager</Title>
      <Company>Company name</Company>
      <Location>Boston</Location>
      <EndDate>2013-04-11</EndDate>
      <c>acce</c>
      <id>MNYN-95ZL8L</id>
      <Description>This is a detailed description...</Description>
    </Oppurtunity>

Теперь мне нужно получить значение описания из определенного узла Oppurtunity, то есть я хочу получить описание из того, где указан идентификатор. Мне нужно сделать что-то вроде этого:

//My XElement object is called oppurtunities
oppurtunities = new XElement((XElement)Cache["Oppurtunities"]);

string id = Request.QueryString["id"];

//I want to do something like this but of course this is not working
var description = (from job in oppurtunities
                              .Element("Oppurtunities")
                              .Element("Oppurtunity")
                              .Element("Description")
                              where job.Element("id") == id).SingleOrDefault();

person user2257510    schedule 09.04.2013    source источник


Ответы (1)


Вы должны переместить .Element("Description") дальше в своем запросе, чтобы разрешить работу id условия:

//I want to do something like this but of course this is not working
var description = (from job in oppurtunities
                              .Element("Oppurtunities")
                              .Elements("Oppurtunity")
                   where job.Element("id") == id
                   select job.Element("Description")).SingleOrDefault()

Чтобы сравнить Element("id") как строку, используйте преобразование (string)XElement - оно будет работать, даже если <id> не будет найдено:

where (string)job.Element("id") == id

Использование XElement.Value вызовет NullReferenceException в этой ситуации.

person MarcinJuraszek    schedule 09.04.2013
comment
Спасибо! Это сделало это. Мне просто нужно было установить, где job.Element(id).Value, так как он сравнивается со строкой. - person user2257510; 09.04.2013