Expression.Call中的ToUpper()

下面的代码工作,但我想介绍一个ToUpper()

 var predicate = Expression.Lambda<Func>( 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")} 

我该怎么改变?

只需添加一个Expression.Call

 var predicate = Expression.Lambda>( 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") 

编辑:好的,我误解了这个问题。 问题是你在调用FirstName属性的结果上直接调用Contains 。 您需要首先在属性上调用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>(contains, parameter); 

请注意,这不是“文化安全的” – 使用不区分大小写的比较会更安全。 这个问题显示了使用IndexOf的方法,但LINQ提供程序可能不支持这种方法(之后我不知道你对这个表达式树做了什么)。