Ich bin gerade dabei, ein aufwendigeres Filtersystem für unser riesiges Projekt zu entwickeln. Eines der Hauptprädikate besteht darin, Comparations über einen String-Parameter übergeben zu können. Dies drückt sich in der folgenden Form aus: "& gt; 50" oder "5-10" oder "& lt; 123.2"
Was ich habe (als ein Beispiel zur Veranschaulichung)
ViewModel:
%Vor%EF Modell:
%Vor%Ausdruck, den ich gerne benutzen würde:
%Vor%Ausdruck, den ich gerne erhalten möchte:
%Vor%Oder etwas Ähnliches
Allerdings ... Ich habe keine Ahnung, wo ich anfangen soll. Ich habe es auf
eingegrenzt %Vor%Es mag nicht einmal richtig sein, aber das ist alles, was ich habe. Der Vergleich Builder ist nicht das Problem, das ist das einfache Bit. Der harte Teil gibt tatsächlich den Ausdruck zurück. Ich habe nie versucht, Ausdrücke als Funktionswerte zurückzugeben. Also im Grunde, was ich behalten muss, ist das Feld und zurück einen Vergleichsausdruck, so ziemlich.
Irgendwelche Hilfe? : x
Aktualisierung:
Leider löst das mein Problem nicht. Vielleicht liegt es daran, dass ich in den letzten 23 Stunden aufgestanden bin, aber ich habe nicht die geringste Ahnung, wie ich es zu einer Erweiterungsmethode machen kann. Wie gesagt, was ich möchte ... ist im Grunde eine Art zu schreiben:
%Vor%Die Art und Weise, wie ich diese Funktion ausgeformt habe (wahrscheinlich völlig falsch) ist
%Vor%Es fehlt der "this-etwas-Wert", mit dem man zuerst vergleichen kann, und ich habe noch nicht herausgefunden, wie es in der Lage ist, einen Ausdruck zu erhalten ... wie für ReSharper, schlägt es vor ich es stattdessen in boolean umwandeln ...
Mein Kopf ist im Moment voller Flaum ...
Update 2:
Ich habe es geschafft, einen Weg zu finden, einen Code zu haben, der in einem Speicher-Repository in einer Konsolenanwendung funktioniert. Ich muss es noch mit Entity Framework versuchen.
%Vor%Allerdings bezweifle ich sehr, dass ich danach suche.
Update 3:
Richtig, nachdem ich mich vor der letzten Antwort wieder durch Lambda-Ausdrücke gesetzt habe, habe ich etwas gefunden, das dem folgenden ähnlich ist, es enthält nicht die genauen Anforderungen von "Compare ()", aber es ist eine Überlastung -ish 'Wo Methode:
%Vor%Aber trotz meiner Augen scheint alles logisch, ich bekomme eine Laufzeitausnahme von:
%Vor%Dies ist offensichtlich die Täterlinie:
%Vor%Ich bin der Lösung sehr nahe. Wenn ich diesen Fehler von meinem Rücken bekomme, glaube ich, dass EF in der Lage sein sollte, das in SQL zu übersetzen. Sonst ... naja, die letzte Antwort wird wahrscheinlich gehen.
Um einen Ausdruck zu generieren, der in SQL (eSQL) übersetzt wird, sollten Sie Expression
manuell erzeugen. Hier ist ein Beispiel für GreaterThan Filtererstellung, andere Filter können mit ähnlicher Technik erstellt werden.
Hier ist das Anwendungsbeispiel. (Angenommen, wir haben StackEntites
EF-Kontext mit der Entität SetEnitities von TestEntity
-Entitäten)
Aktualisierung:
Für die Erstellung komplexer Ausdrücke können Sie folgenden Code verwenden:
(Nehmen Sie an, Sie haben bereits CreateLessThanExpression
und CreateBetweenExpression
Funktionen erstellt)
Eine der auf den ersten Blick magischen Funktionen des C # -Compilers kann die harte Arbeit für Sie erledigen. Sie wissen wahrscheinlich, dass Sie das tun können:
%Vor% Verwenden Sie einen Lambda-Ausdruck, um Func
zuzuordnen. Aber wusstest du, dass du auch das tun kannst:
Das heißt, Verwenden Sie einen Lambda-Ausdruck, um Expression
zuzuweisen, das eine Func
ausdrückt? Es ist ziemlich nett.
Wenn Sie sagen,
Der Vergleich Builder ist nicht das Problem, das ist das einfache Bit. Die Hard Teil gibt tatsächlich den Ausdruck
zurück
Ich gehe davon aus, dass Sie die Lücken hier ausfüllen können; Angenommen, wir geben '' & lt; 50 "an:
%Vor% Um schließlich Expression
s zusammen mit &&
zu erstellen (und immer noch Expression
), tun Sie Folgendes:
Der harte Teil gibt tatsächlich den Ausdruck zurück.
Übersetzt Strings in strukturiertere Konstruktionen wie Enums und Klassen, um Eigenschaften, Operatoren und Filter zu definieren:
%Vor%Dann ist eine Funktion zum Erstellen eines Ausdrucks definiert:
%Vor% PredicateBuilder
hier wird benötigt, um zwei Ausdrücke mit% co_de zu kombinieren % Operator.
Verwendung:
%Vor%Es wird genau wie in einem Beispiel Ausdruck erstellt
%Vor%Tags und Links .net c# linq lambda expression