2012-04-11 3 views
2

Ich habe Schwierigkeiten beim Erstellen von Lambda-basierten Linq-Ausdrücken aus einer Zeichenfolge. Hier ist mein Grund Fall mit dieser Probe Objekt/Klasse:Wie erstellt man einen dynamischen Lambda-basierten Linq-Ausdruck aus einem String in C#?

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

Im Grunde brauche ich eine Zeichenfolge wie folgt zu konvertieren:

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

In a/Linq Ausdruck Prädikat:

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

Dies entspricht also dem Linq-Ausdruck in der unten angegebenen 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 sie in dieser Art von Fall zu arbeiten, wo ich einen Linq-Ausdruck aus Zeichenfolge erstellen, die nicht wissen, vor der Zeit 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 NuGet Paket als auch als „DynamicQuery“ verfügbar) gefragt wurde hier

+5

Warum setzen Sie den Ausdruck in eine Zeichenfolge ein? Gibt der Benutzer diesen Ausdruck ein? Speichern Sie es in seinem richtigen Typ. –

+0

Der Nichtentwicklerbenutzer gibt dynamisch eine Abfragesyntax ein, die einer Suchsyntax ähnelt, die in der Querystring übergeben wird, und dann muss all dies, z. Es ist etwas schwieriger, den richtigen Typ zu erhalten, wenn es sich um eine Eigenschaft oder Untereigenschaft einer großen Anzahl von Typen und verschachtelten Typen handeln kann. – jon333

Antwort

1

eine ähnliche Frage:

Is there an easy way to parse a (lambda expression) string into an Action delegate?

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, sie sind 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. Ein guter Weg, darüber nachzudenken, ist, dass es bedeutet, dass Ihr Lambda-Ausdruck vom Kompilierer zur Kompilierungszeit interpretiert wird, und Variablen durch Instanziieren eines Objekts aus dieser Klasse zur Laufzeit aufgelöst werden.

Um dies zu demonstrieren, sollten Sie Folgendes berücksichtigen:

var myLambda = x => x * x 

Sie werden bemerken, das 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, weil der Begriff eines Lambda-Ausdrucks nicht zur Laufzeit in der CLR existiert (in der gleichen Form wie im Code). Eine Zeichenfolge, die wie ein Lambda-Ausdruck aussieht, ist genau das ...

+0

Dies funktioniert für Top-Level-Eigenschaften mit der Dynamic Linq-Bibliothek, aber ich kann keine Untereigenschaften oder Untersammlungen zum Ersetzen erhalten. var test = string.Format ("{0} == {1}", propertyName, value); var e = Dynamischer Ausdruck.ParsenLambda (Test); Ich wünschte, ich könnte etwas wie folgt übersetzen: query = query.Where ( x => x.MockClass.SubCollection.Any (y => y.Name.StartsWith (filter.Value))); – jon333

Verwandte Themen