Lambda expression "Contains"

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) 
+4
source share
1 answer

There is no Contains statement (although there are methods called Contains ). This will only make sense for some types (such as String, collections, and some others), but not for others; for example, how would you define the Contains operator for integers or dates?

Now, if you want to apply the Contains method to a string using a lambda expression, you need to generate an expression that calls the method using Expression.Call .

+3
source

Source: https://habr.com/ru/post/1369005/


All Articles