2010-09-30 7 views
0

Je suis en train d'interroger un fichier XML avec une requête linqyc linq. Je l'ai suivi le blog de ScottGuC# XML Dynamic LINQ

scottGu's Blog

Mais j'ai un problème pour faire la clause where. C'est le scénario.

<Rates>
<Rate id="1" tax="20.5" sex="M" name="Jhon">
<Rate id="2" tax="2.5" sex="F" name="Aline">
</Rate>

L'idée est d'interroger le XML à l'aide d'un filtre avec le sexe et le nom.

XDocument doc = XDocument.Load(new StringReader(xml));
var query = doc.Elements("Rates").Attributes().AsQueryable().Where("sex='M' and and name='Jhon'");

-je utiliser cette méthode, car la méthode SelectSingleNode() J'ai un problème si le paramètre dans la clause WHERE ne sont pas ordonnés et parce que la requête est dynamique.

Mais j'ai cette erreur:
No property or field 'sex' exists in type 'XAttribute'

Je ne sais pas est la syntaxe sont correctes, et si est la bonne façon de faire une requête dynamique. Je n'ai pas trouvé d'exemple dans internet avec une requête xml.

Merci pour toute réponse! D.

Répondre

0
XDocument doc = XDocument.Load(new StringReader(xml)); 
var query = from element in doc.Elements("Rates") 
      Where element.Attribute("sex").Value.Equals('M') && 
        element.Attribute("name").Value.Equals("John") 
      select element; 

C'est comme cela que j'irais. Semble un peu plus facile à lire que le vôtre et vous donne la sortie que vous espérez. Prendre plaisir!

+0

Désolé, j'ai mal lu votre question. C'est une requête Linq basique et non dynamique. Comme je n'ai aucune expérience avec la bibliothèque Dynamic Linq, je ne peux même pas vraiment mettre à jour ma réponse du tout – Adkins

+0

Thx! Mais les xml ne sont pas égaux. La seule chose égale est la racine du document "Rates" mais le contenu (pour le contenu que je veux dire les attributs xml) change pour chaque xml. Les attributs peuvent être plus ou moins, et le changement de nom. Pour cela je dois pouvoir utiliser une requête dynamique non codée dans le fichier. – hanc

0

Dynamic Linq ne fonctionne pas comme ça. Les critères que vous utilisez dans la clause Where génère une expression similaire à ceci:

... Where(attr => attr.sex == "M" && attr.name == "John") 

sex et name ne sont pas des propriétés de XAttribute, il ne fonctionne pas. Quoi qu'il en soit, je ne pense pas que vous pouvez utiliser Dynamic Linq pour générer des requêtes Linq to XML ... Cela fonctionne pour Linq to Objects, et aussi pour Linq to SQL et Linq to Entities parce que l'expression est transformée en SQL par le fournisseur Linq, mais il n'y a pas de fournisseur qui génère des requêtes Linq vers XML ...