2012-12-21 63 views
2

下面工作的代碼,但我想介紹一個ToUpper()ToUpper的()在Expression.Call

var predicate = 
    Expression.Lambda<Func<T, bool>>(
     Expression.Call(
      Expression.PropertyOrField(parameter, "FirstName"), 
      "Contains", null, 
      Expression.Constant("myvalue".ToUpper())), parameter 
     ); 

結果是:

{Param_0 => Param_0.FirstName.Contains("MYVALUE")} 

,但我想這一點:

{Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")} 

我該如何更改?

回答

5

只需添加一個Expression.Call

var predicate = 
    Expression.Lambda<Func<T, bool>>(
     Expression.Call(
      Expression.Call(// <=== this one is new 
       Expression.PropertyOrField(parameter, "FirstName"), 
       "ToUpper", null), 
      "Contains", null, 
      Expression.Constant("myvalue".ToUpper())), parameter 
     ); 

然後報告本身:

Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE") 
5

編輯:好的,我會誤讀這個問題。問題是你直接致電Contains調用FirstName屬性的結果。您需要先致電ToUpper,例如

var firstName = Expression.PropertyOrField(parameter, "FirstName"); 
var firstNameUpper = Expression.Call(firstName, "ToUpper", null); 
var target = Expression.Constant("myvalue".ToUpper()); 
var contains = Expression.Call(firstNameToUpper, "Contains", null, target); 
var lambda = Expression.Lambda<Func<T, bool>>(contains, parameter); 

請注意,這不是「文化安全」 - 使用不區分大小寫的比較會更安全。 This question顯示了一種使用IndexOf的方法,但您的LINQ提供程序可能不支持這種方法(之後我不知道您對此表達式樹做了什麼)。

+0

感謝喬恩。但這不是我想要的結果。我想在來自「FirstName」的值上做一個ToUpper(),然後做一個字符串已經是大寫的「Contains」。 –

+0

@Kris啊。錯誤的問題。當我回到家時會修復... –

+0

喬恩,或者如果它更容易做一個「包含」與一個IgnoreCase –