2011-08-25 105 views
4

我使用動態過濾器,它使用對象屬性,操作符和值過濾集合。現在,如果屬性是一個字符串,操作符是「包含」,值是「單詞」,則應該對包含「世界」的過濾對象進行相應的過濾。Lambda Expression「Contains」

在Linq我有表達式。 EqualNotEqualGreaterThanOrEqualLessThanOrEqual

,但沒有 「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 

編輯:

使用的解決方案,gratie托馬斯萊韋斯克和喬恩斯基特)

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) 
+0

'Contains'是什麼意思?告訴我們你將如何在VB中編寫它。 – Gabe

+0

@Gabe:「Contains」應該表示類似於SQL中的LIKE或像.NET中的字符串Contains()。例如「Microsoft Word」.Contains(「Microsoft」) – serhio

+0

「Contains」不是比較運算符。它是一個函數調用。 –

回答

3

沒有Contains運營商(雖然有方法名爲Contains)。它只適用於某些類型(如String,集合和其他一些類型),但不適用於其他類型;例如,如何定義整數或日期的Contains運算符?

現在,如果要通過lambda表達式將Contains方法應用於字符串,則必須使用Expression.Call生成調用方法的表達式。

+0

有效性......但是我應該創建這樣的表達式,但至少對於字符串peroperties – serhio

+1

@serhio:不清楚你的意思是 - 但使用Expression.Call並不困難,正如我今天給出了一個使用它的例子:http://stackoverflow.com/questions/7193974/how-do-i-nest-a-call調用方法使用表達式調用/ 7194171#7194171 –

+0

@Jon:我使用動態過濾器,它使用對象屬性,運算符和值過濾集合。現在,如果屬性是一個字符串,操作符是「包含」,值是「單詞」,則包含「世界」的過濾對象應該被相應地過濾。 我想,除了調用我應該使用類似Evaluate,以獲得從lambda表達式 – serhio