Лямбда-выражение "Содержит" - PullRequest
4 голосов
/ 25 августа 2011

Я использую динамический фильтр, который фильтрует коллекцию, используя свойства объекта, операторы и значения. Теперь, если свойство является строкой, оператор «содержит», а значение - «слово», отфильтрованные объекты, содержащие «мир», должны быть отфильтрованы соответствующим образом.

В 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

РЕДАКТИРОВАТЬ:

Использованное решение, спасибо Томасу Левеску и Джону Скиту)

  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)

1 Ответ

3 голосов
/ 25 августа 2011

Нет оператора Contains (хотя есть методы с именем Contains).Это имеет смысл только для некоторых типов (например, String, collection и некоторых других), но не для других;например, как бы вы определили оператор Contains для целых чисел или дат?

Теперь, если вы хотите применить метод Contains к строке через лямбда-выражение, вы должны сгенерировать выражение, которое вызываетметод, используя Expression.Call .

...