LINQ to XML,在VB.NET中获取唯一节点

时间:2014-03-06 16:37:41

标签: xml vb.net linq

我有一个XML文件,代表用户有权访问的图书清单。

<Book Bookid="1" BookName="Book1" />
<Book Bookid="1" BookName="Book1" />
<Book Bookid="2" BookName="Book2" />
<Book Bookid="1" BookName="Book1" />

这是一个名为xBooks的XElement

我试图将每本书都放在XML中一次。

Dim DistinctBooks = (From item In xBooks.Elements("Book") Select item).Distinct()

该行似乎没有做任何事情,DistinctBooks的值与xBooks相同。

我已经搜索了解决方案,但似乎每个正在做LINQ的人都是用C#来做的。虽然我发现C#中的其他帖子应该可以正常工作,但我要么没有正确地从C#转换为VB,要么VB做的事情不同。任何人都可以让我在正确的方向上让我在VB中工作吗?

谢谢!

萨姆

3 个答案:

答案 0 :(得分:0)

假设已声明:

Dim xBooks = <books>
               <Book Bookid="1" BookName="Book1"/>
               <Book Bookid="1" BookName="Book1"/>
               <Book Bookid="2" BookName="Book2"/>
               <Book Bookid="1" BookName="Book1"/>
             </books>

我认为你正在寻找这样的东西:

Dim DistinctBooks = From item In xBooks.Elements("Book")
                    Select bookid = item.Attribute("Bookid").Value,
                           bookName = item.Attribute("BookName").Value
                    Distinct

为什么它不起作用是因为如果考虑它实现的所有属性的集合,每个节点都是不同的。通过上面的内容,您可以告诉它您需要哪些属性作为唯一键的一部分。另请注意,不需要组合多种LINQ样式(查询和功能),您可以使用单词Distinct作为查询的一部分。

答案 1 :(得分:0)

使用VB扩展@ Neolisk的正确答案,您可能需要考虑使用更简洁的语法:

Dim DistinctBooks = From item In xBooks.<Book>
                    Select bookid = item.@Bookid,
                           bookName = item.@BookName
                    Distinct

答案 2 :(得分:0)

这个帖子迟了几年..但是

我相信他要求' lamba '表达式而不是' sql '表达式。

我现在使用这个LINQ Lambda表达式来处理我的VB.NET项目:(windows 7,vs15)

Dim myxdoc As XDocument = XDocument.Load(xdocfilepath)
Dim newlist = myxdoc.Root.Descendants.GroupBy(Function(x) x.Name).Select(Function(x) x.First).Where(Function(x) x.Name = "partNumber").ToList

For Each item In newlist
     Debug.Print(item.Value.ToString())
Next