オブジェクトのプロパティ、演算子、値を使用してコレクションをフィルタリングする動的フィルターを使用します。これで、プロパティが文字列で、演算子が「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)