2011-08-25 107 views
4

我使用动态过滤器,它使用对象属性,操作符和值过滤集合。现在,如果属性是一个字符串,操作符是“包含”,值是“单词”,则应该对包含“世界”的过滤对象进行相应的过滤。Lambda Expression“Contains”

在Linq我有表达式。 EqualNotEqualGreaterThanOrEqualLessThanOrEqual

,但没有 “Contains”。如何更换它?

考虑下面的代码(在VB.NET,但无所谓)

Select Case compOp 
    Case ComparisonOperator.Contains 
     ' ?????? WHAT HERE ???? ' 
     filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(Expression.Equal(myObjPropertyParam, myConstExpression), myObjParam) 

    Case ComparisonOperator.Different 
     filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(Expression.NotEqual(myObjPropertyParam, myConstExpression), myObjParam) 

    Case ComparisonOperator.Equal 
     filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(Expression.Equal(myObjPropertyParam, myConstExpression), myObjParam) 

    Case ComparisonOperator.GreatherThanOrEqual 
     filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(Expression.GreaterThanOrEqual(myObjPropertyParam, myConstExpression), myObjParam) 

    Case ComparisonOperator.LessThanOrEqual 
     filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(Expression.LessThanOrEqual(myObjPropertyParam, myConstExpression), myObjParam) 
    End Select 

编辑:

使用的解决方案,gratie托马斯莱韦斯克和乔恩斯基特)

Dim expr As Expression = Nothing 

    Select Case compOp 
    Case ComparisonOperator.Contains 
     expr = Expression.Call(myObjPropertyParam, "Contains", Nothing, constantExpression) 
    Case ComparisonOperator.Different 
     expr = Expression.NotEqual(myObjPropertyParam, constantExpression) 
    Case ComparisonOperator.Equal 
     expr = Expression.Equal(myObjPropertyParam, constantExpression) 
    Case ComparisonOperator.GreatherThanOrEqual 
     expr = Expression.GreaterThanOrEqual(myObjPropertyParam, constantExpression) 
    Case ComparisonOperator.LessThanOrEqual 
     expr = Expression.LessThanOrEqual(myObjPropertyParam, constantExpression) 
    End Select 

    filterExpression = Expression.Lambda(Of Func(Of PropertyType, Boolean))(expr, myObjParam) 
+0

'Contains'是什么意思?告诉我们你将如何在VB中编写它。 – Gabe

+0

@Gabe:“Contains”应该表示类似于SQL中的LIKE或像.NET中的字符串Contains()。例如“Microsoft Word”.Contains(“Microsoft”) – serhio

+0

“Contains”不是比较运算符。它是一个函数调用。 –

回答

3

没有Contains运营商(虽然有方法名为Contains)。它只适用于某些类型(如String,集合和其他一些类型),但不适用于其他类型;例如,如何定义整数或日期的Contains运算符?

现在,如果要通过lambda表达式将Contains方法应用于字符串,则必须使用Expression.Call生成调用方法的表达式。

+0

有效性......但是我应该创建这样的表达式,但至少对于字符串peroperties – serhio

+1

@serhio:不清楚你的意思是 - 但使用Expression.Call并不困难,正如我今天给出了一个使用它的例子:http://stackoverflow.com/questions/7193974/how-do-i-nest-a-call调用方法使用表达式调用/ 7194171#7194171 –

+0

@Jon:我使用动态过滤器,它使用对象属性,运算符和值过滤集合。现在,如果属性是一个字符串,操作符是“包含”,值是“单词”,则包含“世界”的过滤对象应该被相应地过滤。 我想,除了调用我应该使用类似Evaluate,以获得从lambda表达式 – serhio