C# 表达式中的ToUpper()。调用

C# 表达式中的ToUpper()。调用,c#,.net,linq,C#,.net,Linq,下面的代码可以工作,但我想介绍一个ToUpper() 但我想这样: {Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")} 我怎样才能改变呢?编辑:好吧,我误解了这个问题。问题是,您直接在调用FirstName属性的结果上调用Contains。您需要首先对属性调用ToUpper,例如 var firstName = Expression.PropertyOrField(parameter, "FirstName"); va

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

但我想这样:

{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<Func<T, bool>>(contains, parameter);
var firstName=Expression.PropertyOrField(参数“firstName”);
var firstNameUpper=Expression.Call(firstName,“ToUpper”,null);
var target=Expression.Constant(“myvalue.ToUpper());
var contains=Expression.Call(firstNameToUpper,“contains”,null,target);
var lambda=表达式.lambda(包含,参数);

请注意,这不是“文化上安全的”——使用不区分大小写的比较更安全。显示了一种使用
IndexOf
的方法,但您的LINQ提供程序可能不支持这种方法(我不知道您以后如何处理此表达式树)。

只需添加一个
表达式。调用

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
        );

谢谢你,乔恩。但这不是我想要的结果。我想先对来自“FirstName”的值做一个ToUpper(),然后再做a“Contains”,其中字符串已经是大写的.Jon,或者如果更容易的话,用IgnoreCase@Kris-I:我已经编辑了你要找的树的答案,但我会看看是否能找到更好的方法。
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);
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")