调用Expression.IfThenElse的ArgumentException

时间:2015-02-14 08:06:33

标签: vb.net linq expression-trees

我正在尝试构建此LINQ查询:

Result = Result.Where(Function(Row) If(IsDBNull(Row(7)), False, Convert.ToInt32(Row(7)) > 10))

ResultIEnumerable(Of Object())

我设法使用此代码构建表达式,但在最后一行,我收到一条错误消息。

我的代码是:

Dim whereMethod = GetType(Queryable).GetMethods(BindingFlags.Public Or BindingFlags.Static).First(Function(m) m.Name = "Where").MakeGenericMethod(GetType(Object()))
Dim convertMethod As MethodInfo = Nothing
Dim rowParameter = Expression.Parameter(GetType(Object()), "Row")
Dim isdbnullMethod As MethodInfo = GetType(System.Convert).GetMethod("IsDBNull", New Type() {GetType(Object)})
Dim expr As Expression = Nothing
Dim tempexpr As Expressions.LambdaExpression = Nothing
convertMethod = GetType(System.Convert).GetMethod("ToInt32", New Type() {GetType(Object)})

tempexpr = Expression.Lambda(Expression.IfThenElse(
                             Expression.Call(isdbnullMethod,
                                 Expression.ArrayAccess(rowParameter, Expression.Constant(7))),
                             Expression.Constant(False),
                             Expression.GreaterThan(
                                 Expression.Call(
                                     convertMethod,
                                     Expression.ArrayAccess(rowParameter, Expression.Constant(7))),
                                 Expression.Constant(10))),
                         rowParameter)

然后我打电话给:

expr = Expression.Call(whereMethod, Result.AsQueryable.Expression, Expression.Lambda(tempexpr.Body, rowParameter))

在这一行我得到了这个错误:

enter image description here

可能是什么问题?没有IfThenElse它就可以了。还有这个:

Result = Result.Where(Function(Row) Convert.ToInt32(Row(7)) > 10)

修改

这是因为If运算符是“Action”方法而不返回值吗?

顺便说一下。 Expression.IfThenElse使用IIf函数。我怎么能使用If函数?

编辑II

我想,我找到了它:Expression.Condition。它也使用IIf,但有了这个,我没有例外。

1 个答案:

答案 0 :(得分:2)

您的编辑II是正确的:Expression.IfThenElse返回void,使整个表达式为ActionExpression.Condition会返回ifTrue参数中的任何类型,使您的表达式为Expression(Of Func(Of Boolean)),这就是您想要的。

顺便说一句,我不相信它真的称之为IIf功能。这只是对正在发生的事情的调试视图。我不认为它真的称之为VB.NET专用方法