Wie verwandle ich einen String in einen linq-Ausdruck?

8

Similar: Konvertieren Sie eine Zeichenfolge in Linq.Expressions oder verwenden Sie eine Zeichenfolge als Selektor?

Ein ähnliches Beispiel: Übergeben eines Linq-Ausdrucks als String?

Eine weitere Frage mit der gleichen Antwort: Erstellen eines dynamischen Lambda-basierten Linq-Ausdrucks aus einer Zeichenfolge in C #?

Grund dafür, etwas zu fragen, das so viele ähnliche Fragen hat:

Die akzeptierte Antwort in diesen ähnlichen Fragen ist inakzeptabel, da sie alle auf eine Bibliothek von vor vier Jahren verweisen (vorausgesetzt, dass sie von Code-Master Scott Gu geschrieben wurde), geschrieben für ein altes Framework (.net 3.5), und nicht bereitstellt alles andere als eine Verbindung als Antwort.

Es gibt eine Möglichkeit, dies im Code ohne eine ganze Bibliothek zu tun.

Hier ist ein Beispielcode für diese Situation:

%Vor%

Beachten Sie, dass hier nicht versucht wird, eine ganze Zeichenfolge in einen Ausdruck wie

umzuwandeln %Vor%

Stattdessen wird versucht, nur die Zeichenfolge als Zugriff zu verwenden

%Vor%     
Travis J 13.07.2012, 23:15
quelle

3 Antworten

15

Hier ist ein Ausdruck Baum Versuch. Ich weiß immer noch nicht, ob das mit dem Entity-Framework funktionieren würde, aber ich denke, es ist einen Versuch wert.

%Vor%

Nennen Sie es so:

%Vor%

Wenn Sie Expression<Func<T,int>> anstelle von nur Func verwenden können, entfernen Sie einfach den Aufruf von Compile (und ändern Sie die Signatur von MakeGetter ).

Bearbeiten : In den Kommentaren fragte TravisJ, wie er es so benutzen könnte: w => "text" + w.classTypeId

Es gibt mehrere Möglichkeiten, dies zu tun, aber aus Gründen der Lesbarkeit würde ich empfehlen, zuerst eine lokale Variable wie folgt einzuführen:

%Vor%

Der Hauptpunkt ist, dass der Getter nur eine Funktion ist, und Sie können sie genau so verwenden, wie Sie es normalerweise tun würden. Lies Func<T,int> wie folgt: int DoSomething(T instance)

    
Paul Phillips 13.07.2012, 23:50
quelle
2

Hier ist eine Erweiterungsmethode für Sie mit meinem Testcode (linqPad):

%Vor%

Ergebnisse:

    
Hogan 14.07.2012 00:14
quelle
1

Ich habe das nicht versucht und bin mir nicht sicher, ob es funktionieren würde, aber könntest du etwas wie:

verwenden

b => b.GetType().GetProperty(classTypeId).GetValue(b, null);

    
Duncan Howe 13.07.2012 23:46
quelle

Tags und Links