Ich stimme zu mit mquander's
Antwort. Der Grund, warum ein solches Konstrukt funktioniert, liegt in der Art und Weise, wie Compiler Ausdrücke auswerten. In diesem Fall für LLBLGen erwartet der zweite Parameter etwas, das als Boolean ausgewertet werden kann (zum Beispiel).
Operatoren (+, -, ***, /) sind lediglich Ausdrücke, die der Compiler verwendet, um Syntaxbäume zu erstellen, anhand derer er prüft, ob bestimmte Kombinationen von linken und rechten Ausdrücken im jeweiligen Kontext ("+") gültig sind. Zum Beispiel a
(String-Literal) + 2.4
(float) ist in C# offensichtlich nicht gültig, und der Compiler weiß dies durch die Validierung der Ausdrücke (Zeichenfolge) (operator_add) (Schwimmer) .
Damit ein seltsames Szenario wie das folgende funktionieren kann, müssen Sie also
FetchEntities(EntityType.Employee,
EmployeeFields.Salary > ((EmployeeFields.DateOfBirth - 10) * 1.2) + 1024)
wäre es notwendig, die Operatoren (- und *** und +) zu überladen, um ein neues "Prädikat"-Objekt zurückzugeben.
Letztendlich würde eine solche Aussage in den folgenden Syntaxbaum übersetzt werden (die Elemente in "()" sind Ausdruckstypen für die Zwecke dieser Antwort)
(BinaryComparison)
LeftSide: (Field_Reference) --> EmployeeFields.Salary
RightSide:
(MathematicOperator)
LeftSide:
(MathematicOperator)
LeftSide:
(MathematicOperator)
LeftSide: (Field_Reference) --> EmployeeFields.DateOfBirth
RightSide: (constant) --> 10
Operator: --> -
RightSide: (constant) --> 1.2
Operator: --> ***
RightSide: (constant) --> 1024
Operator: --> +
Operator: --> >
Dies ist die gesamte Grundlage dafür, wie Dinge wie Lambda-Ausdrücke und fließende Abfragen funktionieren. Es läuft alles auf die Auswertung von Ausdrücken hinaus.
Lambda-Ausdrücke sind insofern ausdrucksstärker, als sie Objekte und deren Felder, Eigenschaften und Methoden berühren können und die Bildung eines Syntaxbaums beliebiger Länge ermöglichen.