无法将FieldExpression转换为LambdaExpression

时间:2014-05-22 10:45:54

标签: vb.net linq entity-framework linqkit

我已编写以下函数来检查数据库中重叠时间段的添加/修改记录:

<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;。

我没有看到我正在使用任何字段表达式 - ActivistIDFromDateTillDate都是属性。

我正在使用EF5并生成POCO类。

我该如何解决这个问题?

更新

如果我在观看窗口中输入criteriaExpr.Expand,我就不会得到例外。但是,如果我输入criteriaExpr.Expand.Compile,我会得到同样的例外。

1 个答案:

答案 0 :(得分:2)

请参阅:How do closures work behind the scenes? (C#)

如果从内部函数访问外部作用域的变量,则编译器会创建一个隐藏类型以将变量作为字段拥有。您的criteriaExpr访问外部函数参数,因此它包含FieldExpression s。

我快速浏览了LinqKit的源代码(您似乎使用ExpandCompile进行判断),看起来它并不支持Invoke上的FieldExpression