无法将IEnumerable转换为已知类型

时间:2018-02-02 07:04:40

标签: vb.net linq casting

我有ocPeopleObservableCollection(of Person)并希望执行以下操作:

Dim Attendees As IEnumerable = (From p In ocPeople
                                        Where (p.TypeID = 24)
                                        Select p.PersonID, p.FullName
                                        Order By FullName).Cast(Of People)
        For Each Attendee As Person In Attendees
            <some code>
        Next

但是我收到了错误:

  

无法将类型为'VB $ AnonymousType_0`2 [System.Int64,System.String]'的对象强制转换为'People'。

我不明白为什么会抛出错误。

更新 问题不在于Linq,它来自For ... Next循环。即使我打开Option Infer On,也将for语句写成:

For Each Attendee in Attendees

我仍然得到同样的错误。

1 个答案:

答案 0 :(得分:0)

在您的查询中,您执行选择。 Select的结果不是People对象,而是包含PersonId和FullName的匿名对象。

如果您的People对象仅包含PersonId和FullName,则应选择完整的p:

Select p
Order By ...

如果您不想要所选的People对象,但需要包含PersonId和所选People对象的FullName的新People对象,则应在Select中创建一个新的People对象。

唉,我不熟悉你如何在visual basic中创建一个新对象,但它将类似于下面的内容:

select new People(p.PersonId, p.FullName)
order by ...

这可能是错的,但你得到了要点

错误出现在foreach

你在foreach中得到错误的原因是因为Linq语句没有创建序列,它创建了枚举序列的可能性。

只要您不对您的序列进行枚举,就不会查询原始集合。

当您执行foreach时,或者使用非延迟执行语句(如ToList(),FirstOrDefault(),Any(),Sum()等)时,对集合进行枚举.Linq函数是否使用延迟每个Linq函数的注释部分都描述了执行

您的运行时错误是关于序列的枚举,而不是关于可枚举的创建。这就是为什么只有当你枚举它时才会得到的原因。