4

オブジェクトのプロパティ、演算子、値を使用してコレクションをフィルタリングする動的フィルターを使用します。これで、プロパティが文字列で、演算子が「contains」で値が「word」の場合、「world」を含むフィルタリングされたオブジェクトはそれに応じてフィルタリングされる必要があります。

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

編集:

使用済みソリューション、ThomasLevesqueとJonSkeetに感謝)

  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

1 に答える 1

3

Contains演算子はありません(ただし、という名前のメソッドContainsがあります)。一部のタイプ(文字列、コレクション、その他いくつか)にのみ意味があり、他のタイプには意味がありません。たとえばContains、整数または日付の演算子をどのように定義しますか?

ここで、ラムダ式を介してメソッドを文字列に適用する場合は、 Expression.CallContainsを使用して、メソッドを呼び出す式を生成する必要があります。

于 2011-08-25T17:57:25.270 に答える