我已编写以下函数来检查数据库中重叠时间段的添加/修改记录:
<Extension> Function ClashRecords(Of T)(Query As IQueryable(Of T), Record As T, _
KeySelector As Expression(Of Func(Of T, Integer)),
FromSelector As Expression(Of Func(Of T, DateTime)),
TillSelector As Expression(Of Func(Of T, DateTime))) As IQueryable(Of T)
Dim key = KeySelector.Invoke(Record)
Dim fromDate = FromSelector.Invoke(Record)
Dim tillDate = TillSelector.Invoke(Record)
Dim criteriaExpr As Expression(Of Func(Of T, Boolean)) = Function(x) KeySelector.Invoke(x) = key And FromSelector.Invoke(x) <= tillDate And TillSelector.Invoke(x) >= fromDate
Return Query.AsExpandable.Where(criteriaExpr.Expand)
End Function
按以下方式调用函数时:
Dim de As New DataEntities()
Dim w=New Work With {.WorkerID=-1,.FromDate=New DateTime(2014,3,20,7,0,0),.TillDate=New DateTime(2014,3,20,8,30,0)}
Dim clashing = de.Works.ClashRecords(w,Function(x) x.ActivistID, Function(x) x.FromDate, Function(x) x.TillDate)
我收到以下错误:
InvalidCastException:无法转换类型为&#39; System.Linq.Expressions.FieldExpression&#39;的对象。输入&#39; System.Linq.Expressions.LambdaExpression&#39;。
我没有看到我正在使用任何字段表达式 - ActivistID
,FromDate
,TillDate
都是属性。
我正在使用EF5并生成POCO类。
我该如何解决这个问题?
更新
如果我在观看窗口中输入criteriaExpr.Expand
,我就不会得到例外。但是,如果我输入criteriaExpr.Expand.Compile
,我会得到同样的例外。
答案 0 :(得分:2)
请参阅:How do closures work behind the scenes? (C#)
如果从内部函数访问外部作用域的变量,则编译器会创建一个隐藏类型以将变量作为字段拥有。您的criteriaExpr
访问外部函数参数,因此它包含FieldExpression
s。
我快速浏览了LinqKit的源代码(您似乎使用Expand
和Compile
进行判断),看起来它并不支持Invoke
上的FieldExpression
。