如何在 VB.Net 中循环访问匿名类型的 IEnumerable

How to loop through IEnumerable of anonymous type in VB.Net

提问人:Massey 提问时间:6/20/2023 最后编辑:djvMassey 更新时间:6/23/2023 访问量:71

问:

我以数据表的形式从 SQL 服务器获取数据。我按 VendorID 对数据进行分组,如果字段有多个值,则连接行数据。下面给出了此代码,它工作正常。

Dim dt As DataTable = GetVendorData()
Dim results = From p In dt.AsEnumerable()
              Group p By VendorID = p.Field(Of String)("VenID") Into g = Group
              Select New With {
                  Key .VendorID = VendorID,
                  Key .FundNumber = String.Join(";", From i In g Select i.Field(Of String)("FundNumber")),
                  Key .Statefund = String.Join(";", From i In g Select i.Field(Of String)("Statefund")),
                  Key .State = String.Join(";", From i In g Select i.Field(Of String)("State"))
              }

我尝试遍历并获取各个字段数据,如下所示

For Each result As DataRow In results
    Dim x As String = result.Field(Of String)("FundNumber"))
Next

但是我收到以下错误。

System.InvalidCastException
HResult=0x80004002
消息 = 无法将类型为“VB$AnonymousType_1”4[System.String,System.String,System.String,System.String]“的对象强制转换为类型”System.Data.DataRow”

vb.net LINQ

评论

0赞 djv 6/20/2023
您选择的是匿名类型,而不是您所说的 DataRowNew With { ...For Each result As DataRow In results
0赞 Hursey 6/20/2023
Linq 的结果不再是 Datarow,而是 Anonymous Type。如果你只是,它有帮助吗?For Each result in results
0赞 user466663 6/20/2023
我也试过了。但是,它甚至无法编译。我收到此错误:“未声明”结果”。由于其保护级别,它可能无法访问”
0赞 djv 6/20/2023
@user466663,它与原始代码没有什么不同,只是隐式类型。怎么不申报?

答:

1赞 djv 6/20/2023 #1

您返回的是一个匿名类型,其中

Select New With {
    Key .VendorID = VendorID,
    Key .FundNumber = ...

您应该能够将 result 用作匿名类型并访问创建的 FundNumber 字段

For Each result In results
    Dim x As String = result.FundNumber
Next

顺便说一句,错误消息

无法强制转换类型为“VB$AnonymousType_1”的对象...键入“System.Data.DataRow”

很清楚

评论

0赞 Massey 6/20/2023
我也试过了。但是,它甚至无法编译。我收到此错误:“未声明”结果”。由于其保护级别,它可能无法访问”
1赞 Massey 6/23/2023 #2

我在 .vb 文件的顶部添加了这一行,解决了这个问题:

选项推断