我有一个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中工作吗?
谢谢!
萨姆
答案 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