2014-11-19 5 views
0

Я запрашиваю XML, используя LINQ TO XML. Я хочу запросить записи на основе некоторой условной проверки, вот мой XML ниже: XML будет иметь несколько ордеров, каждый заказ будет в я хочу, чтобы выбрать порядок, который имеет значение хранилища атрибутов элемента param, не является нулевым, а если существует должно быть 1, а также порядок с информацией картонной ...Выбрать элементы на основе условия LINQ TO XML C#

<orders> 
     <order> 
      <criteria> 
       <param name="location">123</param> 
       <param name="name">Chicago</param> 
       <param name="Store">1</param> 
       <param name="Account Number">1212121212</param> 
      </criteria> 
      <items> 
       <item> </item> 
       <item> </item>   
      </items> 
      <cartons> 
       <carton> 
        <size> </size> 
        <weight></weight> 
       </carton> 
      </cartons> 
     </order> 
    <Order> 
    </Order> 
    </orders> 

Я могу сделать до этого:

var result = from item in doc.Descendants("order") 
       where item.Element("criteria").Element("param").Attribute("name").Value.Contains("store") == true 
       && item.Element("cartons") != null 
       select item;" 

Над отлично работает, если мой магазин (пары) атрибут первый в узле фильтра, но если я перееду в магазине (парам) в другое положение, чем сначала, он не отфильтровывает его

+4

Хорошо, что все звучит разумно - что вы пробовали до сих пор? Вы посмотрели на метод 'XElement.Attribute' и' XElement.Element'? Например: «... Где (x => x.Element (« критерии »). Элементы (« param »). Любой (p => (строка) p.Attribute (« name ») ==« Сохранить »&& (int) p.Value == 1)) ' –

+0

Хорошо, у меня есть этот« var result = from item in doc.Descendants («order») где item.Element («критерии»). Элемент («param») .Attribute ("name"). Value.Contains ("store") == true && item.Element ("cartons")! = Null select item; " – msbyuva

+1

Пожалуйста, поместите это в * вопрос *, и объясните, в чем разница между тем, что он делает в данный момент, и тем, что вы хотите сделать. –

ответ

5

Проблема в том, что вы смотрите только на одинparam элемент - всегда первый, потому что это то, что делает Element.

Вы хотите, чтобы соответствовать, если любой параметров является элемент «Магазин» со значением 1, так что вы хотите использовать метод Any и использовать Elements найти все параметры:

var query = from item in doc.Descendants("order") 
      where item.Element("criteria").Elements("param") 
         .Any(p => p.Attribute("name").Value == "Store" && 
           (int) p == 1) 
        && item.Element("cartons") != null 
      select item; 

Выражение запроса на самом деле не помогает вам здесь - я бы использовал:

var query = doc.Descendants("order") 
       .Where(item => item.Element("criteria").Elements("param") 
            .Any(p => p.Attribute("name").Value == "Store" && 
              (int) p == 1) 
           && item.Element("cartons") != null); 
+0

Это простой ответ. Я не думаю, что он может пойти не так, используя ваш фрагмент кода! –

+0

@ Jon Skeet спасибо за ответ ... Любая функция сделала трюк .. еще раз спасибо .. !! – msbyuva

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