Erweiterungsmethode, die Lambda-Ausdruck durch Vergleich zurückgibt

8

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.

    
NeroS 15.05.2012, 11:33
quelle

3 Antworten

6

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.

%Vor%

Hier ist das Anwendungsbeispiel. (Angenommen, wir haben StackEntites EF-Kontext mit der Entität SetEnitities von TestEntity -Entitäten)

%Vor%

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)

%Vor%     
The Smallest 15.05.2012, 18:05
quelle
4

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:

%Vor%

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:

%Vor%     
AakashM 15.05.2012 12:06
quelle
0
  

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%     
Lightman 28.01.2016 21:54
quelle

Tags und Links