andr_gin schrieb:
2.) Wozu kann man LINQ jetzt konkret brauchen? Ich finde die SQL Strings eh schon ziemlich praktisch, da man sich einfach einmal eine Funktion excecute und getvalue machen kann bzw. eine Funktion, die mir mehrere Datensätze liest und in irgendeine Struktur speichert (queue von object arrays oder so). Wenn man dann wieder irgendeinen extra Standard hat, dann ist das ja eher ein Nachteil. Was der ganze Recordset Scheiß bewirkt, sieht man in Access mit den Formularen ja sehr gut.
Die Frage hatte ich mir zu Anfang auch gestellt, aber LINQ hat ein paar erhebliche Vorteile gegenüber normalen SQL-Strings.
Zum Einen wäre da die Tatsache, dass die Abfragen
strong typed sind.
Du kannst also nicht aus Versehen einen String aus der DB holen und ihn einer Integer Variablen zuweisen. Das wird nicht nur beim Compilieren, sondern schon beim Editieren erkannt, dass die Datentypen nicht übereinstimmen.
Ein weiterer Vorteil der sich daraus ergibt ist natürlich auch, dass Intellisense funktioniert und Einem zum Beispiel alle Methoden vorhersagen kann, die dem Ergebnis der Abfrage zur Verfügung stehen werden.
Ein ganz wichtiger Vorteil von LINQ ist auch, dass man die Abfragen nicht nur über Datenbanken oder XML Dateien ausführen kannst, sondern über allem, was die IEnumerable Schnittstelle implementiert und das sind praktische alle Listen und Collections, die du finden kannst.
So kannst du zum Beipsiel "SQL Abfragen" über die Registry durchführen oder über die Prozessliste.
Beispiel:
Code:
Dim Result = From Proc In Diagnostics.Process.GetProcesses Where Proc.ProcessName.StartsWith("s")
Wenn man sich das Select-Statement spart, dann entspricht das einem "Select *".
Möchte man nur die Prozessnamen haben, dann müsste man an die Abfrage noch ein "Select Proc.ProcessName" hinzufügen. Ganz richtig.
Hinzufügen. In LINQ kommt die Select Anweisung zum Schluss. Es handelt sich also nicht um herkömmliche SQL Befehle, obwohl die Schlüsselworte alle die selben sind, sondern um eine eigenständige Syntax.
Das finde ich aber ehrlich gesagt auch nicht so schlimm. Die Unterschiede sind doch recht gering und meiner Meinung nach sogar teilweise ganz vorteilhaft.
Naja, wie dem auch sei. Die Abfrage liefert dir also in Result eine Liste mit allen Prozessen, die mit "s" beginnen, die du dann über
Code:
For Each Proc In Result : Debug.WriteLine(Proc.ProcessName) : Next
ausgeben kannst
spoolsv
svchost
smss
svchost
svchost
svchost
services
shstat
svchost
Einfacher geht's nun wirklich nicht mehr.
BTW:
Wie du vielleicht festgestellt hast habe ich nirgendwo definiert von welchem Datentyp "Result" oder "Proc" ist.
Das ist Dank
type inference auch nicht mehr nötig. Der Compiler erkennt selbstständig welche Typen es sein müssen anhand der Daten, die ihm zugewiesen werden. Er nimmt dann die Deklaration selbstständig vor.
Das ist aber nicht mit später Bindung zu verwechseln. Wenn man im Code einmal einer Variable einen Wert zugewiesen hat, dann steht der Datentyp beim Compilieren schon fest.
Nachdem man "i" also den Wert 123 zugewiesen hat kann man "i" später nicht mehr den Wert "Hello World" zuweisen, da der Compiler "i" schon als Integer deklariert hat. Es ist also einfach nur eine Art sich unnötige Schreibarbeit zu sparen, was gerade bei LINQ Abfragen von Nutzen sein kann, da sie auf diese Weise deutlich übersichtlicher werden.
So. Das nur mal als kurzen Überblick über die wichigsten Vorteile von LINQ. Vor allem das Funktionieren von Intellisense ist hier nicht zu unterschätzen. Das macht das Coden der Abfragen extreeeem einfach.
PS:
Momentan ist PLINQ auch schon sehr weit fortgeschritten. Damit ist es super einfach möglich SQL-Abfragen zu parallelisieren, was bei heutigen Multi-Core Prozessoren deutliche Geschwindigkeitsvorteile bringt.
Ich konnte mir gar nicht vorstellen, dass man ein und die selbe Abfrage parallelisieren kann, aber es geht tatsächlich. Jeder Thread liefert ein Teil der Ergebnisse zurück, die dann anschließend zusammengeführt werden und als Gesamtergebnis weiter verarbeitet werden können. Wie das technisch funktioniert kann ich mir nicht wirklich erklären.
PLINQ wurde momentan allerdings nur als CTP (Community Technologie Peview) released, aber ich denke spätestens mit dem .NET FX 4.0 wird es auch offiziell eingeführt werden.
Da dürfen sich die Performancesüchtigen also noch auf einiges freuen.
Puh. Ich hoffe, dass ich jetzt keinen Buffer Overflow erzeugt habe. Ist doch etwas länger geworden als geplant. Passiert bei mir aber leider, wenn ich von einer Sache so begeistert bin.