我认为这个异常实际上是由我在 BLL 中修改的 LINQ to Entities 查询中的问题引起的。我最初忽略了这个变化,但是一旦我改变了“有问题的” BLL 类名,我就遇到了这个异常:
无法转换类型
'System.Collections.Generic.IEnumerable1[[OrgName.ProjName.bllTableB,
ProjNameBLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'
to type
'System.Collections.Generic.List1[[OrgName.ProjName.bllTableB,
ProjNameBLL,版本=1.0.0.0,文化=中性,PublicKeyToken=null]]'。
LINQ to Entities 仅支持转换 EDM 原语或枚举
类型。
当我在以下示例中从GetTableAByID(Int32) 调用.ToList() 时引发了此运行时异常:
Public Class TableA
Public Property TableAID as Integer
Public Property TableBs as New List(Of TableB)()
Public ReadOnly Property Amount as Decimal
Get
If Me.TableBs.Count > 0 Then
Return Me.TableBs.Sum(Function(tb) tb.Amount)
Else
Return 0
End If
End Get
End Property
Public Shared Function GetTableAs() As IQueryable(Of TableA)
Dim db As New DataAccess.ProjNameEntities()
Return (
From ta In db.TableAs
Order By ta.PaidDate Descending
Select New TableA With {
.TableAID = ta.TableAID,
.TableBs = (
From tb In db.TableBs
Where tb.TableAID = ta.TableAID
Select New TableB With {
.Amount = tb.Amount
}
)
}
)
End Function
Public Shared Function GetTableAByID(TableAID as Integer) as List(Of TableA)
Return (
From ta in GetTableAs()
Where ta.TableAID = TableAID
).ToList()
End Function
End Class
Public Class TableB
Public Property TableBID as Integer
Public Property TableAID as Integer
Public Property Amount as Decimal
End Class
显然从DbQuery<T> 转换为List<T> 应该没有问题,所以我怀疑异常消息只是让我大吃一惊。我决定查看查询,看看是否有什么东西导致了问题。果然,就是它所在的地方。
这段代码的违规部分似乎是我在List(Of TableB) 中选择了New TableB。我重构了类和查询以避免这种模式(我真正需要的是 TableB.Amount 的总和)并且所有错误都清除了。
如果能对这个问题以及由此产生的非常误导的例外情况有所了解,我会很高兴。
编辑:
我发现只需将.ToList() 添加到子查询的末尾也可以解决问题,从而增加了facepalm 因子:
.TableBs = (
From tb In db.TableBs
Where tb.TableAID = ta.TableAID
Select New TableB With {
.Amount = tb.Amount
}
).ToList()