如何将LINQ扩展方法的调用转换为相应的表达式树

时间:2012-05-23 10:58:14

标签: .net vb.net linq entity-framework-4 expression-trees

以下LINQ查询。调用扩展方法在Visual Basic 2010中选择正常工作:

Dim qAvSalary = qJobData.Select(Function(e) e.AvSalary)

但是这样做我无法使用字符串变量指定我想要查询的属性的名称(例如AvSalary)。如果我使用LINQ表达式树,这应该是可能的。搜索并尝试了很长时间如何将查询转换为相应的表达式树并不成功。我的最终方法是:

' The IQueryable data to query.
Dim queryableData As IQueryable(Of JobData) = qJobData.AsQueryable()
Dim pe As ParameterExpression = Expression.Parameter(GetType(JobData), "e")
Dim sPropertyName = "AvSalary"      ' or some other property depending on the business logic
Dim propex = Expression.Property(pe, sPropertyName)

Dim selectCallExpr As MethodCallExpression = Expression.Call(
        GetType(Queryable),
        "Select",
        New Type() {queryableData.ElementType},
        queryableData.Expression,
        Expression.Lambda(Of Func(Of JobData, System.Nullable(Of Int32)))(
                    propex,
                    New ParameterExpression() {pe}))

执行此语句会引发以下异常:

  

Message =“Keine generische Methode”选择“fürPlass”System.Linq.Queryable“ist mit den bereitgestellten Typargumenten und Argumenten kompatibel.Es sollten keine Typargumente bereitgestellt werden,wenn die Methode nicht generisch ist。”

怎么了?

1 个答案:

答案 0 :(得分:0)

选择有两个类型参数。 类型。同时指定。