Was kann Expression.Quote (), Expression.Constant () nicht bereits?

Hinweis: Mir ist die frühere Frage „Was ist der Zweck der Expression.Quote-Methode von LINQ?, aber wenn Sie weiterlesen, werden Sie feststellen, dass meine Frage nicht beantwortet wird.

Ich verstehe, was der angegebene Zweck vonExpression.Quote() ist. Jedoch,Expression.Constant() kann für den gleichen Zweck verwendet werden (zusätzlich zu allen Zwecken, dieExpression.Constant() wird bereits verwendet für). Daher verstehe ich nicht, warumExpression.Quote() ist überhaupt erforderlich.

Um dies zu demonstrieren, habe ich ein kurzes Beispiel geschrieben, in dem man normalerweise @ verwendeQuote (siehe die mit Ausrufezeichen markierte Zeile), aber ich habe @ verwendConstant stattdessen und es hat genauso gut funktioniert:

string[] array = { "one", "two", "three" };

// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')

Expression<Func<char, bool>> innerLambda = ch => ch == 'e';

var str = Expression.Parameter(typeof(string), "str");
var expr =
    Expression.Lambda<Func<string, bool>>(
        Expression.Call(typeof(Queryable), "Any", new Type[] { typeof(char) },
            Expression.Call(typeof(Queryable), "AsQueryable",
                            new Type[] { typeof(char) }, str),
            // !!!
            Expression.Constant(innerLambda)    // <--- !!!
        ),
        str
    );

// Works like a charm (prints one and three)
foreach (var str in array.AsQueryable().Where(expr))
    Console.WriteLine(str);

Die Ausgabe vonexpr.ToString() ist auch für beide gleich (ob ich @ benutConstant oderQuote).

Angesichts der obigen Beobachtungen scheint es, dassExpression.Quote() ist redundant. Der C # -Compiler könnte dazu gebracht worden sein, verschachtelte Lambda-Ausdrücke in einen Ausdrucksbaum zu kompilieren, an dem @ beteiligt isExpression.Constant() Anstatt vonExpression.Quote() und jeder LINQ-Abfrageanbieter, der Ausdrucksbäume in eine andere Abfragesprache (z. B. SQL) umwandeln möchte, könnte nach einem @ Ausschau halteConstantExpression mit TypExpression<TDelegate> anstelle einerUnaryExpression mit dem besonderenQuote Knotentyp, und alles andere wäre gleich.

Was vermisse ich? Warum warExpression.Quote() und das besondereQuote Knotentyp fürUnaryExpression erfunden?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage