Wie erstellt man einen dynamischen Lambda-basierten Linq-Ausdruck aus einem String in C #?

c# dynamic-linq expression-trees lambda linq

Frage

Ich habe Schwierigkeiten beim Erstellen von Lambda-basierten Linq-Ausdrücken aus einer Zeichenfolge. Hier ist mein Grundfall mit diesem Beispielobjekt / Klasse:

public class MockClass
{
    public string CreateBy { get; set; }
}

Grundsätzlich muss ich eine Zeichenfolge wie folgt konvertieren:

string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”;

In einen Prädikat / linq Ausdruck:

System.Linq.Expressions.Expression<Func<T, bool>>  or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>>

Dies entspricht dem Linq-Ausdruck in der Where-Methode:

query = query.Where(x => x.CreateBy.Equals(filter.Value,
StringComparison.OrdinalIgnoreCase));

Ich habe versucht, die folgenden Helfer zu verwenden, aber ich kann nicht herausfinden, wie man sie in dieser Art von Fall zum Arbeiten bringt, wo ich in der Lage sein möchte, einen Linq-Ausdruck aus einer Zeichenfolge zu erstellen, die nicht vorher bekannt ist: http: //www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (es ist jetzt als ein verfügbar NuGet-Paket auch "DynamicQuery" genannt)

Akzeptierte Antwort

Eine ähnliche Frage wurde hier gestellt:

Gibt es eine einfache Möglichkeit, einen (Lambda-Ausdruck) String in einen Action-Delegaten zu parsen?

Nach meinem Verständnis ist diese dynamische Abfrage ein Framework, um Beschränkungen für eine Where-Klausel zu übergeben, ohne einen Lambda-Ausdruck zu verwenden.

Die Bedeutung davon ist, dass Lambda-Ausdrücke keine dynamischen Methoden sind, sondern anonyme Methoden. Wenn Sie sich jemals eine Assembly ansehen, werden Sie sehen, dass Ihre Lambda-Ausdrücke in Closures mit beliebigen freien Variablen als Felder konvertiert werden. Die Klasse verfügt über eine Methode mit einer Signatur, die Ihrer entspricht, Feldvariablen werden am Aufrufpunkt zugewiesen.

Eine gute Möglichkeit, darüber nachzudenken, ist, dass dies bedeutet, dass Ihr Lambda-Ausdruck vom Compiler während der Kompilierung interpretiert wird und Variablen durch Instanziieren eines Objekts aus dieser Klasse zur Laufzeit aufgelöst werden.

Stellen Sie Folgendes dar, um dies zu demonstrieren:

var myLambda = x => x * x

Sie werden feststellen, dass dies nicht funktioniert. Das liegt daran, dass der Compiler zum Zeitpunkt der Kompilierung den Typ von x kennen muss, um die zugehörige Klasse / Methode zu erstellen.

All dies ist wichtig, da der Begriff eines Lambda-Ausdrucks zur Laufzeit nicht in der CLR existiert (in der gleichen Form wie im Code). Ein String, der wie ein Lambda-Ausdruck aussieht, ist genau das ...



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum