簡體   English   中英

在 Expression.Call 中的 ToUpper()

[英]ToUpper() in an Expression.Call

下面的代碼有效,但我想介紹一個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")}

我怎樣才能改變?

只需添加一個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 提供程序可能不支持這種方法(我不知道您之后對這個表達式樹做了什么)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM