String-Ausdrücke in LINQ-Ausdrucksbäume analysieren
Die Auswertung logischer Bedingungen, die als Strings dargestellt werden, anhand von Objektinstanzen erfordert einen systematischen Ansatz. Die Implementierung einer benutzerdefinierten Grammatik und eines AST mithilfe von ANTLR ist zwar eine praktikable Option, kann jedoch eine übermäßig komplexe Lösung sein. Hier sind einige alternative Ansätze:
Dynamic LINQ Library
Die Dynamic LINQ-Bibliothek bietet eine praktische Möglichkeit, Zeichenfolgenausdrücke dynamisch in Ausdrucksbäume zu analysieren. Es bietet eine Methode namens DynamicExpression.ParseLambda, die einen Lambda-Ausdruck annimmt und einen kompilierten Ausdruck zurückgibt, der zum Auswerten von Bedingungen verwendet werden kann:
var p = Expression.Parameter(typeof(Person), "Person"); var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);
Expression Tree Assembly
Sie können Ausdrucksbäume auch manuell mithilfe der Expression-Klasse zusammenstellen. Dieser Ansatz erfordert ein tieferes Verständnis der LINQ-Ausdrucksbaumstruktur, ermöglicht jedoch eine bessere Kontrolle über den Ausdruckserstellungsprozess:
var ageExpr = Expression.GreaterThan(Expression.Property(p, "Age"), Expression.Constant(3)); var weightExpr = Expression.GreaterThan(Expression.Property(p, "Weight"), Expression.Constant(50)); var andExpr = Expression.AndAlso(ageExpr, weightExpr); var ageLessThanExpr = Expression.LessThan(Expression.Property(p, "Age"), Expression.Constant(3)); var orExpr = Expression.OrElse(andExpr, ageLessThanExpr);
Einfache Zeichenfolgenauswertung
If Da die Ausdruckszeichenfolgen relativ einfach sind, können Sie sie mit einer Kombination aus Reflexion und Zeichenfolgenanalyse auswerten. Dieser Ansatz ist weniger flexibel, kann aber für begrenzte Szenarien geeignet sein:
var filter = "(Person.Age > 3) AND (Person.Weight > 50) OR (Person.Age < 3)"; var result = bob.GetType().GetProperty("Age").GetValue(bob) > 3 && bob.GetType().GetProperty("Weight").GetValue(bob) > 50 || bob.GetType().GetProperty("Age").GetValue(bob) < 3;
Der beste Ansatz hängt von der Komplexität der Ausdrücke und dem erforderlichen Maß an Flexibilität beim Parsen ab. Für einfache Szenarien können einfache String-Auswertungen oder reflexionsbasierte Methoden ausreichen. Für komplexere Ausdrücke und dynamische Parsing-Anforderungen sollten Sie jedoch die Verwendung der Dynamic LINQ-Bibliothek in Betracht ziehen oder Ausdrucksbäume manuell zusammenstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich String-Ausdrücke effizient in LINQ-Ausdrucksbäume analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!