Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 子体上的linq到xml枚举_Vb.net_Linq To Xml - Fatal编程技术网

Vb.net 子体上的linq到xml枚举

Vb.net 子体上的linq到xml枚举,vb.net,linq-to-xml,Vb.net,Linq To Xml,大家好,我正在阅读一篇教程,试图编写一个简单的linq查询。但我似乎无法让它发挥作用。我试图在附加的xml文档中显示这两个地址,但只能显示第一个地址。有人能帮我弄清楚为什么两个都没有打印出来吗。多谢各位 <?xml version="1.0" encoding="utf-8" ?> <Emails> <Email group="FooBar"> <Subject>Test subject</Subject> <

大家好,我正在阅读一篇教程,试图编写一个简单的linq查询。但我似乎无法让它发挥作用。我试图在附加的xml文档中显示这两个地址,但只能显示第一个地址。有人能帮我弄清楚为什么两个都没有打印出来吗。多谢各位

<?xml version="1.0" encoding="utf-8" ?>
<Emails>
  <Email group="FooBar">
    <Subject>Test subject</Subject>
    <Content>Test Content</Content>
    <EmailTo>
      <Address>foo@bar.com</Address>
      <Address>bar@foo.com</Address>
    </EmailTo>
  </Email>
</Emails> 




    Dim steve = (From email In emailList.Descendants("Email") _
                Where (email.Attribute("group").Value.Equals("FooBar")) _
                Select content = email.Element("EmailTo").Descendants("Address")).ToList()



    If Not steve Is Nothing Then
        For Each addr In steve
            Console.WriteLine(addr.Value)
        Next
        Console.ReadLine()
    End If

受试者
测试内容
foo@bar.com
bar@foo.com
Dim steve=(来自emailList.com(“电子邮件”)中的电子邮件)_
其中(email.Attribute(“group”).Value.Equals(“FooBar”))_
选择content=email.Element(“EmailTo”).subjections(“Address”).ToList()
如果不是,史蒂夫什么都不是
对于steve中的每个地址
控制台写入线(地址值)
下一个
Console.ReadLine()
如果结束

当前查询返回一个
列表。这意味着您需要两个嵌套的
foreach
循环:一个循环列表,另一个循环IEnumerable的内容

相反,您可以更新LINQ查询以使用该方法并直接获取地址。在查询格式中,
SelectMany
使用第二个
from
子句表示子查询。这将类似于以下内容:

Dim query = (From email In emailList.Descendants("Email") _
            Where (email.Attribute("group").Value.Equals("FooBar")) _
            From addr In email.Element("EmailTo").Descendants("Address") _
            Select addr.Value).ToList()

If query.Any() Then
    For Each addr In query
        Console.WriteLine(addr)
    Next
End If
此外,如果您只想迭代结果,而不想将结果用作列表用于其他目的,则不需要使用
ToList

编辑:为了解释此查询的工作原理,我们将其分为两部分:

第一:

From email In emailList.Descendants("Email") _
Where (email.Attribute("group").Value.Equals("FooBar")) _
这将查询所有
节点,并仅匹配组属性值为“FooBar”的节点

第二:

From addr In email.Element("EmailTo").Descendants("Address") _
Select addr.Value
这是一个子查询,在第一部分(上面)结束的地方继续。它本质上是一种进一步查询原始查询结果的方法。这里我们查询所有
节点,最后,为节点的内部文本选择它们的
值。我们需要这样做的原因是
子体(“地址”)
返回一个包含所有“地址”元素的
IEnumerable
。我们需要执行额外的查询(或
foreach
)来迭代这些值并提取它们的值

另一种方法是将其分解为两个查询:

Dim query1 = From email In emailList.Descendants("Email") _
             Where (email.Attribute("group").Value.Equals("FooBar"))
             Select email.Element("EmailTo").Descendants("Address")
Dim query2 = query1.SelectMany(Function(addr) addr.Select(Function(a) a.Value))

请注意,在
query2
中使用了
SelectMany
query2
中的
Select
是我前面提到的在
IEnumerable
上循环的额外工作。原始查询比query1/query2更清晰,但我写它们只是为了澄清问题。

我不完全理解linq语句的工作原理。你能帮我把它分解一下吗?或者给我指一些我可以阅读的资源。我不理解的是第二条from。这怎么能满足我的需要。谢谢你的回答和帮助对不起,刚刚看了返回结果,我期待的结果是Foo@bar.com新线bar@Foo.com我得到的是foo@bar.com新线foo@bar.comwhoops,我的错误我没有包括你的选择声明对不起。答案和广告一样有效,你能解释一下为什么它有效吗。感谢you@gh9在我的帖子中添加了一个解释。希望有帮助!很好的解释,非常感谢!!