da haperts aber für die Generierung von vernünftigen
SQL Statements (abgesehen von nem full table select) noch etwas. Vor allem Mangels ExpressionTrees der delegates, die in .Net "einfach" in
SQL umgebaut werden. Bisher gehen einfache Abfragen aber komplette Codegenerierung für Datenklassen über Metadaten aus nem
SQL Server Datenbank Schema ist bereits implementiert.
Wenn du dort auch nur ansatzweise irgendwohin kommen willst, mussu den Ansatz, den du da gerade hast wegwerfen.
Ich frag mich, woher du weißt, welchen Ansatz ich verfolge.
Wenn du wissen willst, was wie gefiltert wird, könntest du IDispatch-Implementierungen bauen, die vom User als OleVariant benutzt werden (aka C# dynamic).
Auf die Art solltest du alle Calls abgreifen können. Du musst halt immer nach jeder Operation ein neues IDispatch zurückgegeben, welches alle vorher aufgezeichneten Operation kennt.
Habe Delphis komische Syntax für Lambdas nicht im Kopf, aber stelle dir eine extension method vor, die Delphis Gegenstück zu Func<OleVariant, Boolean> schluckt.
Der OleVariant, der dort übergeben wird, wäre also nicht das jeweilige Item der Liste. Nope, du würdest die anonym. Method sofort ausführen, da DEIN OleVariant ja alle auf ihn angewandten Operationen aufzeichnet.
Delphi-Quellcode:
YourTable.Where(function(row : OleVariant) : Boolean;
begin
exit((row.SomeColumn = 1) and (row.SomeOtherColumn <> 'Test' );
end);
OleVariant (OV) 1: Ergebnis von row.SomeColumn
OV 2: Ergebnis von OV1 = 1
OV 3: Ergebnis von row.SomeOtherColumn
OV 4: Ergebnis von OV3 <> 'Test'
OV 5: Ergebnis von OV2 and OV4
Sollte
IMHO möglich sein.
Natürlich gehen auf der Basis noch ganz andere Sachen, für die in .Net ExpressionTrees benutzt werden. (Mocking Setups!)
Ich habe in den letzten Tagen bereits mit einer Mischung aus Records/operator overloading und Invokable variant types herum experimentiert und war in der Tat in der Lage unäre und binäre Expressions sowohl in ihre String Repräsentationen umzuwandeln, als auch sie auszuwerten. Aber danke für den Hinweis mit den OleVariants. Werde ich mir mal anschauen.
Edit: Hast du eventuell ein kleines Beispiel, ob und wie ich die Operatoren für nen OleVariant überschreiben kann?
Edit2: Hab was gefunden in der
Unit VarCmplx.pas (die seh ich heute zum ersten mal in meinem Leben
)
Aber mache all das nur solange es dir wirklich Spass macht. Du kannst Delphi nicht in etwas Modernes verwandeln.
Jede dieser Lösung wird einen schalen Beigeschmack haben, und dem Dev, der es einsetzt wird dabei ständig ein kleines Männchen dezent mit einem Holzhammer von innen an die Schädeldecke schlagen um dabei unaufhörlich "HACK! HACK!" brüllen....
Ich will den Thread hier nicht in eine weitere Diskussion zu diesem Thema ausarten lassen, denn ich bin dessen überdrüssig. Nur soviel: eine Programmiersprache ist bis zu einem gewissen Grad nur so modern, wie die Programmierer, die sie nutzen. [ironie]Wenn die Mehrzahl der Delphianer immernoch in ihren Höhlen hausen wollen und mit Delphi 7 Software Praktiken aus dem letzten Jahrtausend praktizieren, bitte[/ironie]. Ich nutze gerne alle Möglichkeiten, die sich mir bieten, um auch das letzte aus der Sprache herauszubekommen, auch wenn ich bloß zu nem VS2010 (Express) greifen müsste, und gleich alles serviert bekomme. Aber wo bliebe da der Spaß?