无法将类型为“WhereSelectEnumerableTerator”2的对象强制转换为Person(VB.Net)

无法将类型为“WhereSelectEnumerableTerator”2的对象强制转换为Person(VB.Net),.net,vb.net,.net,Vb.net,我知道还有其他关于这个错误的线程,并且知道这个错误的含义。但是,在我自己的情况下,我无法确定修复代码在哪里 我需要从API返回Person的IEnumerableOf。以前,我使用For-Each循环,但正在研究使用更少的代码来实现相同的结果。我不确定我是否在这里走得太远了,也许是希望有一个一线涅盘 Public Function [Get]() As IEnumerable(Of Person) Using dt As DataTable = LoadDataTable()

我知道还有其他关于这个错误的线程,并且知道这个错误的含义。但是,在我自己的情况下,我无法确定修复代码在哪里

我需要从API返回Person的IEnumerableOf。以前,我使用For-Each循环,但正在研究使用更少的代码来实现相同的结果。我不确定我是否在这里走得太远了,也许是希望有一个一线涅盘

Public Function [Get]() As IEnumerable(Of Person)
    Using dt As DataTable = LoadDataTable()
        Return New List(Of Person)() From {
            From dr In dt.Rows Select New Person() With {
                .FirstName = dr.Item("FirstName").ToString(),
                .Surname = dr.Item("Surname").ToString()
            }
        }
    End Using
End Function
错误是:

无法强制转换类型为的对象 '其中SelectEnumerableIterator'2[System.Object,MyApp.Models.Person]' 键入“MyApp.Models.Person”


我猜测将.ToList扩展方法放置在不同的位置,但没有正确的方法。有谁能告诉我这一切是否都可以在一次操作中实现,或者我别无选择,只能声明一个新的列表变量吗?

要将@Craig所说的话转化为答案,需要一个逗号分隔的列表,无论您在本例中使用的是什么类型的人,而不是另一个集合

如果要从集合创建列表,则需要使用contstructor:

Return New List(Of Person)(
    From dr In dt.Rows Select New Person() With {
        .FirstName = dr.Item("FirstName").ToString(),
        .Surname = dr.Item("Surname").ToString()
    }
)
但更好的选择是在LINQ查询中调用ToList:

Return (From dr In dt.Rows Select New Person() With {
    .FirstName = dr.Item("FirstName").ToString(),
    .Surname = dr.Item("Surname").ToString()
}).ToList()
此外,如果您觉得更可取,还有一种扩展方法格式,它不太冗长:

Return dt.Rows.Select(Function(dr) New Person() With {
                          .FirstName = dr.Item("FirstName").ToString(),
                          .Surname = dr.Item("Surname").ToString()
                          }).ToList()

要把@Craig所说的话变成一个答案,From需要一个逗号分隔的列表,列出你在这个案例中使用的任何类型的人,而不是另一个集合

如果要从集合创建列表,则需要使用contstructor:

Return New List(Of Person)(
    From dr In dt.Rows Select New Person() With {
        .FirstName = dr.Item("FirstName").ToString(),
        .Surname = dr.Item("Surname").ToString()
    }
)
但更好的选择是在LINQ查询中调用ToList:

Return (From dr In dt.Rows Select New Person() With {
    .FirstName = dr.Item("FirstName").ToString(),
    .Surname = dr.Item("Surname").ToString()
}).ToList()
此外,如果您觉得更可取,还有一种扩展方法格式,它不太冗长:

Return dt.Rows.Select(Function(dr) New Person() With {
                          .FirstName = dr.Item("FirstName").ToString(),
                          .Surname = dr.Item("Surname").ToString()
                          }).ToList()

如果不是返回新列表,而是。。。从,你把帕伦斯放在你的周围从。。。选择并在上面列出吗?或者,如果您不使用新列表中的From,而是使用From。。。选择作为ctor的参数?在我看来,VB希望列表后面的大括号中有一个或多个Person对象,而不是获取一个可枚举对象。如果不是返回新列表,而是。。。从,你把帕伦斯放在你的周围从。。。选择并在上面列出吗?或者,如果您不使用新列表中的From,而是使用From。。。选择作为ctor的参数?在我看来,VB希望列表后面的大括号中有一个或多个Person对象,而不是得到一个可枚举的对象。