我使用动态过滤器,它使用对象属性,操作符和值过滤集合。现在,如果属性是一个字符串,操作符是“包含”,值是“单词”,则应该对包含“世界”的过滤对象进行相应的过滤。Lambda Expression“Contains”
在Linq我有表达式。 Equal
,NotEqual
,GreaterThanOrEqual
,LessThanOrEqual
,但没有 “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)
'Contains'是什么意思?告诉我们你将如何在VB中编写它。 – Gabe
@Gabe:“Contains”应该表示类似于SQL中的LIKE或像.NET中的字符串Contains()。例如“Microsoft Word”.Contains(“Microsoft”) – serhio
“Contains”不是比较运算符。它是一个函数调用。 –