Linq to XML problème de syntaxe 'Where not in'
-
03-07-2019 - |
Question
Le code suivant ne compile pas
Dim BasicGroups As String() = New String() {"Node1", "Node2"}
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Element.@Name not in BasicGroups
For Each XNode In NodesToRemove
XNode.Remove()
Next
Il est supposé supprimer tout enfant immédiat du nœud racine ayant un attribut appelé nom dont la valeur est Non répertoriée dans le tableau de base BasicGroups.
Quelle est la syntaxe correcte pour cette tâche?
La solution
Vous voulez probablement déplacer la partie "pas". Par exemple (code pseudo)
where (not (list.Contains(foo))
Autres conseils
Si l'attribut Name des nœuds à supprimer peut être mis en correspondance à l'aide d'un modèle simple, les opérations suivantes devraient fonctionner:
Dim SchemaDoc As New XDocument(<Root><Group Name="Foo"/><Group Name="Node1"/>
<Group Name="Node2"/><Group name="Bar"/></Root>)
Dim NodesToRemove = From Element In SchemaDoc.<Root>.<Group> Where _
Element.@Name Like "NotNode?"
For Each XNode In NodesToRemove.ToArray()
XNode.Remove()
Next
Notez l'utilisation de ToArray () dans l'énumération de NodesToRemove: vous en aurez besoin pour forcer l'évaluation de XQuery avant de commencer à modifier la collection sur laquelle il repose.
Si cela ne fonctionne pas, voici une alternative à LINQ (à l'origine, je pensais que l'insertion de "non" dans les requêtes LINQ ne fonctionnerait pas, mais une autre réponse m'a immédiatement mis en place: vous apprenez quelque chose de nouveau chaque jour ...):
Dim NodesToRemove As New Collections.ObjectModel.Collection(Of XNode)
For Each Element In SchemaDoc.<Root>.<Group>
If Not BasicGroups.Contains(Element.@Name) Then
NodesToRemove.Add(Element)
End If
Next
Les performances doivent être pratiquement identiques à l'utilisation de LINQ.
Peut-être pouvez-vous essayer quelque chose comme ceci
mylistWithOutUndesirebleNodes = (de b dans NodeLists.Cast () où (de c dans NodesToDeleteList.Cast () où c.Attributes ["atributo"]. Value == b.Attributes ["atributo"]. Value sélectionnez c) .Count () == 0 sélectionnez b) .ToList ();
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Not BasicGroups.Contains(Element.@Name)