我知道SO上有关于此错误的其他线程,并知道错误的含义。但是,在我自己的情况下,我无法确定修复代码的位置。
我需要从API返回IEnumerable(Of Person)
。以前我使用了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
错误是:
无法投射类型的对象 ' WhereSelectEnumerableIterator`2 [System.Object,MyApp.Models.Person]' 输入' MyApp.Models.Person'
我猜测将.ToList()
扩展方法放在不同的地方,但无法正确使用。任何人都可以建议在一次操作中是否所有这些操作,或者我是否可以选择声明New List
变量?
答案 0 :(得分:4)
要将@Craig所说的答案放在答案中,From
需要一个逗号分隔的列表,列出您正在使用的任何类型(在本例中为Person
),而不是另一个集合。
如果要从集合中创建列表,则需要使用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()