Entwickler-Ecke

Off Topic - LINQ für Delphi


delfiphan - Mo 20.12.10 19:34
Titel: LINQ für Delphi
Ich muss das leider ins OT stellen, da es keine fertige Unit ist.

In .NET gibt es ja Lambda-Expressions (für Linq). Damit ist es möglich, dass man z. B. eine Datenbank where-Klausel inline im C#-Quelltext schreibt und diese dann zur Laufzeit in SQL umgewandelt bekommt. Im Prinzip geht das so, dass man zur Laufzeit den Code in der Lambda-Expression als Baumstruktur auslesen kann und diesen beliebig in SQL Statements oder was auch immer umwandeln kann.

Das geht (ein bisschen) auch in Delphi 32!

Folgender Code kompiliert und gibt den angegebenen String zurück:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses DB, Expressions;

{$apptype console}

var
  I: Integer;
  A: TValueExpression;
  B: TBooleanExpression;
  Field: TField;
begin
  Field := TField.Create(nil);
  Field.FieldName := 'MyField';

  I := 2;
  A := 1 + I;
  B := 3 < -A * 2 + Max(Field);

  Writeln(B.ToString); // Output: "(3 < (((-3) * 2) + Max([MyField])))"
  Readln;
end.


Die dazu notwendige Unit ist im Anhang. Ich hab das jetzt nur schnell zusammengebastelt als "proof of concept". Man ist natürlich sehr eingeschränkt aber die Idee ist ganz interessant ;)

Das ganze funktioniert nur mit einer neueren Version von Delphi (vermutlich ab 2006).


Tino - Di 07.06.11 10:05

Hi!

Ich bin zufällig über den Blogeintrag Lambdas and expression trees in Delphi [http://delphisorcery.blogspot.com/2011/05/lambdas-and-expression-trees-in-delphi.html] auf diesen Beitrag hier gestoßen. Ich habe mir die Codeunit allerdings noch nicht angeschaut aber vom Ansatz sieht es schon mal sehr interessant aus! :zustimm:

Sobald ich mal ein wenig Zeit habe schaue ich mir die Codeunit an! ;-)

Gruß, Tino