ToUpper()在一个Expression.Call中

本文关键字:Expression Call 一个 ToUpper | 更新日期: 2023-09-27 17:49:02

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

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")}

如何修改

ToUpper()在一个Expression.Call中

只需添加一个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")

编辑:好吧,我误解了这个问题。问题是你在调用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);

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