我有ocPeople
,ObservableCollection(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
我仍然得到同样的错误。
答案 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函数的注释部分都描述了执行
您的运行时错误是关于序列的枚举,而不是关于可枚举的创建。这就是为什么只有当你枚举它时才会得到的原因。