无法将类型' WhereSelectEnumerableIterator' 2的对象转换为Person(VB.Net)

时间:2017-04-11 13:04:59

标签: .net vb.net

我知道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变量?

1 个答案:

答案 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()