I use a dynamic filter that filters the collection using object properties, operators, and values. Now, if the property is a string, the "contains" operator, and the word value, filtered objects containing "world" should be filtered accordingly.
In Linq, I have an expression. Equal , NotEqual , GreaterThanOrEqual , LessThanOrEqual
but do not have " Contains ". How to replace it?
Consider the following code (in VB.NET, but not relevant)
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
EDIT:
Solution used, thanks to Thomas Levesque and John Skeet)
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)