这是 Linq 表达式中闭包中的捕获问题。
在英语中,这意味着您正在尝试传递CLng(cboProperty.EditValue)
一个 Linq 表达式。这是合法的。但是,当 Linq to Entity Framework 看到它时,它无法将其转换为 SQL。该表达式包含:
- 一个 .net 类(我怀疑很可能是一个 winform 控件)
- .net 类的属性调用
- 对 .net 类结果的 .net 转换调用。
可怜的 Linq2EF 无法弄清楚这些东西!然而,这将起作用。
Dim servhist As IQueryable(Of servicesHistory) = db.servicesHistories
If cboProperty.EditValue <> Nothing Then
Dim editValue = CLng(cboProperty.EditValue)
servhist = servhist.Where(Function(p) p.propID = editValue)
End If
grdServHist.DataSource = servhist.ToList()
现在这看起来完全一样。但是,如果您问 Linq Ninja,他们会告诉您两者非常不同,因为我已将CLng(cboProperty.EditValue)
Linq 表达式转换为函数调用。
我个人对 Lambda 表达式如何具有与 Lambda 函数相同的语法有两种看法,从而导致这些异常。
顺便说一句,我更喜欢这种形式的查询...
Dim editValue = CLng(cboProperty.EditValue)
Dim servhist As IQueryable(Of servicesHistory) = _
db.servicesHistories.Where(Function(p) p.propID = editValue or editValue is Nothing)
grdServHist.DataSource = servhist.ToList()
这允许您随后将 IQueryable 重构为已编译的查询。