Expression.Call中的ToUpper()

Kri*_*s-I 2 .net c# linq

下面的代码有效,但我想介绍一下 ToUpper()

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

结果是:

{Param_0 => Param_0.FirstName.Contains("MYVALUE")}
Run Code Online (Sandbox Code Playgroud)

但是我喜欢这个:

{Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")}
Run Code Online (Sandbox Code Playgroud)

我该怎么改变?

Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ell 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
        );
Run Code Online (Sandbox Code Playgroud)

然后报告自己:

Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")
Run Code Online (Sandbox Code Playgroud)