我正在尝试构建此LINQ查询:
Result = Result.Where(Function(Row) If(IsDBNull(Row(7)), False, Convert.ToInt32(Row(7)) > 10))
Result
是IEnumerable(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))
在这一行我得到了这个错误:
可能是什么问题?没有IfThenElse
它就可以了。还有这个:
Result = Result.Where(Function(Row) Convert.ToInt32(Row(7)) > 10)
修改
这是因为If
运算符是“Action”方法而不返回值吗?
顺便说一下。 Expression.IfThenElse
使用IIf
函数。我怎么能使用If
函数?
编辑II
我想,我找到了它:Expression.Condition
。它也使用IIf
,但有了这个,我没有例外。
答案 0 :(得分:2)
您的编辑II是正确的:Expression.IfThenElse
返回void,使整个表达式为Action
。 Expression.Condition
会返回ifTrue
参数中的任何类型,使您的表达式为Expression(Of Func(Of Boolean))
,这就是您想要的。
顺便说一句,我不相信它真的称之为IIf
功能。这只是对正在发生的事情的调试视图。我不认为它真的称之为VB.NET专用方法