【问题标题】:ToUpper() in an Expression.CallExpression.Call 中的 ToUpper()
【发布时间】:2020-07-21 15:42:14
【问题描述】:

下面的代码可以工作,但我想介绍一个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")}

我该如何改变?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      编辑:好的,我误读了这个问题。问题是您直接在调用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);
      

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

      【讨论】:

      • 谢谢乔恩。但这不是我想要的结果。我想在来自“FirstName”的值上创建一个 ToUpper(),然后再执行字符串已经是大写的“Contains”。
      • Jon,或者如果使用 IgnoreCase 更容易地做一个“包含”
      • @Kris-I:我已经为您正在寻找的树编辑了答案,但我会看看是否能找到更好的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多