VB.NET API开发类型转换错误求助:无法将List转IEnumerable
解决VB.NET API中InvalidCastException类型转换错误
问题原因
你的API方法声明返回IEnumerable(Of Visitor),但调用存储过程pa_Visitors_GetOnSite后得到的是List(Of pa_Visitors_GetOnSite_Result)——这两个是完全独立的实体类型,无法直接隐式转换,因此抛出InvalidCastException。
解决方案
1. 显式属性映射(最通用的生产级方案)
如果pa_Visitors_GetOnSite_Result和Visitor的属性结构一致,通过LINQ的Select方法手动将每个结果对象映射为Visitor实例:
Namespace Controllers Public Class VisitorsController Inherits ApiController Public Function [Get]() As IEnumerable(Of Visitor) Using entities As SignInSystemLiveEntities = New SignInSystemLiveEntities() Return entities.pa_Visitors_GetOnSite() _ .Select(Function(res) New Visitor() With { .VisitorId = res.VisitorId, ' 替换为你的实际属性名 .FullName = res.FullName, .IsOnSite = res.IsOnSite, ' 依次映射所有需要对外暴露的属性 }).ToList() End Using End Function End Class End Namespace
2. 修改EF模型让存储过程直接返回Visitor实体
若使用Entity Framework的EDMX模型:
- 打开EDMX设计器,找到存储过程
pa_Visitors_GetOnSite - 右键选择添加函数导入,在设置面板中将返回类型指定为
Visitor(而非自动生成的pa_Visitors_GetOnSite_Result) - 保存模型并重新生成代码,此时
entities.pa_Visitors_GetOnSite()会直接返回IEnumerable(Of Visitor)
3. 临时调整返回类型(仅适合调试)
如果只是快速验证功能,可以直接修改方法返回类型为存储过程生成的结果类型:
Public Function [Get]() As IEnumerable(Of pa_Visitors_GetOnSite_Result) Using entities As SignInSystemLiveEntities = New SignInSystemLiveEntities() Return entities.pa_Visitors_GetOnSite.ToList() End Using End Function
注意:该方案会让API暴露EF自动生成的内部实体,不符合分层架构设计原则,不建议用于生产环境。
内容的提问来源于stack exchange,提问作者Jacob Binns
相关产品推荐
相关产品推荐

