2

以下のコードは機能しますが、紹介したいのは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")}

どうすれば変更できますか?

4

2 に答える 2

8

を追加するだけ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")
于 2012-12-21T10:03:01.400 に答える
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);

これは「文化的に安全」ではないことに注意してください。代わりに、大文字と小文字を区別しない比較を使用する方が安全です。This questionは、を使用したアプローチを示してIndexOfいますが、それはLINQプロバイダーでサポートされていない可能性があります(後でこの式ツリーで何をしているのかわかりません)。

于 2012-12-21T08:25:30.380 に答える