Vb.net 使用变量修改XDocument查询

Vb.net 使用变量修改XDocument查询,vb.net,visual-studio-2010,linq,linq-to-xml,Vb.net,Visual Studio 2010,Linq,Linq To Xml,我正试图根据复选框的选择构造一个XDocument查询 我有下面的代码,它不工作,因为我不确定所需的语法。我认为这是相当明显的,它试图实现什么;这几乎就是我以前在SQL中构造Where语句的方式。最终的代码中将有大约16个复选框,这就是使用多个If语句的原因 Private Sub NextWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextWord.Click D

我正试图根据复选框的选择构造一个XDocument查询

我有下面的代码,它不工作,因为我不确定所需的语法。我认为这是相当明显的,它试图实现什么;这几乎就是我以前在SQL中构造Where语句的方式。最终的代码中将有大约16个复选框,这就是使用多个If语句的原因

    Private Sub NextWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextWord.Click

    Dim WordDictionary As XDocument = XDocument.Load("Dictionary Resources\Dictionary.xml")

    Dim CheckSelection As String

    If NounCheckbox.Checked = True Then
        CheckSelection = CheckSelection & "noun"
    End If

    If AdjectiveCheckbox.Checked = True Then
        CheckSelection = CheckSelection & "adjective"
    End If


    Dim ToList = From x In WordDictionary.Root.Elements("Word") Where x.Elements("Type").Value = CheckSelection

    For Each result In ToList
        Console.WriteLine(result)
    Next

End Sub
为完整起见,XML文件具有以下结构:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Word ID="1">
    <Type>adjective</Type>
    <English></English>
    <Thai></Thai>
    <Meaning></Meaning>
    <Audio>Dictionary Resources\Sound Files\1.wav</Audio>
    <Picture></Picture>
    <Transliteration></Transliteration>
  </Word>
...
...
</Root>

形容词
字典资源\声音文件\1.wav
...
...

如果试图基于多个选中的选择查询XML,则应将选择添加到
哈希集
列表
也可以,但在这种情况下,
哈希集
是更好的选择)

更新:要直接按索引访问结果,您可以使用
query.ElementAt(1)
,但如果您计划按索引访问不同的项目,这并不是性能方面的最佳选择。您应该使用列表来代替。您可以通过使用
Dim results=query.ToList()
设置一个新变量,或按如下方式更改查询:

Dim results = (From x in WordDictionary.Root.Elements("Word")
              Where selectedTypes.Contains(x.Element("Type").Value)
              Select x).ToList()
现在您已经有了一个列表,您可以通过其索引访问项目。索引是从零开始的,因此要访问列表中的第二项,应该使用
results(1)


如果试图基于多个选中的选择查询XML,则应将选择添加到
哈希集
(在这种情况下,
列表
也可以,但
哈希集
是更好的选择)

更新:要直接按索引访问结果,您可以使用
query.ElementAt(1)
,但如果您计划按索引访问不同的项目,这并不是性能方面的最佳选择。您应该使用列表来代替。您可以通过使用
Dim results=query.ToList()
设置一个新变量,或按如下方式更改查询:

Dim results = (From x in WordDictionary.Root.Elements("Word")
              Where selectedTypes.Contains(x.Element("Type").Value)
              Select x).ToList()
现在您已经有了一个列表,您可以通过其索引访问项目。索引是从零开始的,因此要访问列表中的第二项,应该使用
results(1)


如果查询返回3个节点,并且我想引用第二个节点,那么我将使用什么语法来执行此操作?显然,我语法中的select是错误的
Label1.Text=query.select(2).Element(“English”).Value
谢谢Ahmad,太好了。可以看出,我对XML非常陌生。检查selectedTypes.是否包含x.Element(“Type”).值而不是检查x.Element(“Type”).值是否包含selectedTypes.背后的原因是什么?把它写成后者对我来说似乎更有意义;是否仅仅取决于Contains参数将接受的数据类型?@Andy的想法是您有多个类型,它们被添加到
selectedTypes
。把它想象成一个装满我们感兴趣的各种物品的袋子。我们用它来过滤我们得到的任何东西。它必须存在于我们的“袋子”中才能被接受。当我们检查
x.Element(“Type”).Value时,它返回一种类型。我们根据
选择的类型检查该类型。如果存在,则返回
true
,否则返回
false
。你不能撤消支票。。。没有
“字符串”的概念。存在于(选定类型)
。是的,通过使用
HashSet
List
类型,我们使用
Contains
方法进行检查。如果查询返回3个节点,我想引用第二个节点,我将使用什么语法来执行此操作?显然,我语法中的select是错误的
Label1.Text=query.select(2).Element(“English”).Value
谢谢Ahmad,太好了。可以看出,我对XML非常陌生。检查selectedTypes.是否包含x.Element(“Type”).值而不是检查x.Element(“Type”).值是否包含selectedTypes.背后的原因是什么?把它写成后者对我来说似乎更有意义;是否仅仅取决于Contains参数将接受的数据类型?@Andy的想法是您有多个类型,它们被添加到
selectedTypes
。把它想象成一个装满我们感兴趣的各种物品的袋子。我们用它来过滤我们得到的任何东西。它必须存在于我们的“袋子”中才能被接受。当我们检查
x.Element(“Type”).Value时,它返回一种类型。我们根据
选择的类型检查该类型。如果存在,则返回
true
,否则返回
false
。你不能撤消支票。。。没有
“字符串”的概念。存在于(选定类型)
。是的,通过使用
HashSet
List
类型,我们使用
Contains
方法进行检查。
Label1.Text = results(1).Element("English").Value