2008-10-21 3 views
0

Следующий код не компилируетсяLinq для XML «Где не в» проблемы синтаксиса

Dim BasicGroups As String() = New String() {"Node1", "Node2"} 
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _ 
        Where [email protected] not in BasicGroups 
For Each XNode In NodesToRemove 
    XNode.Remove() 
Next 

Предполагается Удаляйте Немедленное ребенка от RootNode, который имеет атрибут с именем, значение которого не перечисленное в BasicGroups StringArray.

Каков правильный синтаксис этой задачи?

ответ

3

Возможно, вы захотите переместить часть «не». Например, (псевдо код)

where (not (list.Contains(foo)) 
+0

Так что в моем случае ..... Где не базовые группы. Состояния (элемент. @ Name) ... Что работает Великий .. Спасибо. – 2008-10-21 12:14:53

+0

Хорошо, я не был уверен в синтаксисе VB :) – leppie 2008-10-21 12:43:58

1

Если атрибут Name из узлов, которые будут удалены могут быть сопоставлены с помощью простой модели, должно работать:

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 _ 
          [email protected] Like "NotNode?" 
For Each XNode In NodesToRemove.ToArray() 
    XNode.Remove() 
Next 

Обратите внимание на использование ToArray() в перечислении NodesToRemove: вам понадобится это, чтобы принудительно оценить XQuery до начала изменения коллекции, на которой она основана.

Если это не сработает, вот альтернатива использованию LINQ (поскольку изначально я думал, что вставка «нет» в запросы LINQ не сработает, но я был настроен прямо на другой ответ - вы узнаете что-то новое каждый день ...):

Dim NodesToRemove As New Collections.ObjectModel.Collection(Of XNode) 
For Each Element In SchemaDoc.<Root>.<Group> 
    If Not BasicGroups.Contains([email protected]) Then 
    NodesToRemove.Add(Element) 
    End If 
Next 

Производительность должна быть в значительной степени идентичной использованию LINQ.

0

Может быть, вы можете попробовать что-то вроде этого

mylistWithOutUndesirebleNodes = (от б в NodeLists.Cast() где (от гр в NodesToDeleteList.Cast() где c.Attributes [ "atributo"]. Значение == b.Attributes ["atributo"]. Значение выберите c) .Count() == 0 выберите b) .ToList();

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

  • Нет связанных вопросов^_^