2.4. Linq
Linq ist die größte Neuerung und steht für Language Integrated Query - also eine Abfragesprache in der Programmiersprache. Damit können wir Datenmengen (Objekte, DBs und XML-Daten) aus VB heraus verarbeiten ohne SQL, XQuery etc. verwenden zu müssen. Linq verwendet die o.g. Neuerungen intensiv bzw. die Neuerungen treten meist in Verbindung zu Linq auf. Am folgenden Beispiel werde ich Linq näher erläutern:
' 1. Datenquelle erstellen
Dim studenten() As Student = { _
New Student With {.Vorname = "Hans", .Nachname = "Meier", .Noten = New Integer( _
) {1, 1, 2, 2, 3}}, _
New Student With {.Vorname = "Claudia", .Nachname = "Meyer", .Noten = New _
Integer() {2, 5, 3, 3, 2}}, _
New Student With {.Vorname = "Michael", .Nachname = "Müller", .Noten = New _
Integer() {1, 1, 6, 2, 3}}, _
New Student With {.Vorname = "Werner", .Nachname = "Machts", .Noten = New _
Integer() {4, 1, 2, 2, 4}}, _
New Student With {.Vorname = "Thomas", .Nachname = "Stur", .Noten = New Integer( _
) {1, 3, 3, 5, 3}}, _
New Student With {.Vorname = "Bernd", .Nachname = "von Brot", .Noten = New _
Integer() {2, 4, 6, 4, 2}}}
' Query definieren
Dim res = From s In studenten _
Where s.Noten.Average() < 3.0 AndAlso s.Nachname.Length > 5 _
Select Name = s.Vorname & " " & s.Nachname _
Order By Name Descending
' Erst hier wird die Query ausgeführt
For Each r In res
Console.WriteLine(r)
Next Als erstes wird eine Datenquelle definiert - hier ein kleines Array, mit dem wir arbeiten möchten.
Danach kommt das interessanteste - die Linq-Abfrage. Wer SQL kennt, wird viele Parallen denken - diese Anlehnung ist gewollt, damit die Einarbeitung leicht fällt. Da Variablen vor ihrer Benutzung deklariert werden müssen, kommt als erstes die From-Klausel. Der Name ist frei wählbar - er legt nur fest, wie man die einzelnen Objekte namentlich ansprechen will. Er ist vergleichbar mit einer "Zählvariable" bei For (Each).
Danach kommt typischerweise die Where-Klausel, welche Einschränkungen trifft, welche Objekte ausgewählt werden sollen. Nur woher kommt die Average()-Methode? Dazu gleich mehr. Anschließend wählt man nun die Daten aus, die man verarbeiten möchte. In diesem Beispiel habe ich einen Aliasen definiert (Name), welcher aus der Zusammenkettung der Eigenschaften Vor- und Nachname besteht. Zum Schluss wird noch nach diesem Alias absteigend sortiert über die Order By-Klausel. In diesem Beispiel kann die Order By-Klausel zum Schluss stehen, da der "Sortier-Member" ja namentlich bekannt ist. Falls man beim Select einen anonymen Typ verwendet (möglich ist es und auch oft gebräuchlich), muss die Sortierung vor dem Select passieren. Linq gibt es wie erwähnt auch für SQL und XML - das stelle ich in den nächsten Tagen näher vor.
Linq beruht auf s.g, Lambda-Ausdrücken. Das sind Ausdrücke oder Anweisungsblöcke, welche überall verwendet werden können, wo Delegates erwartet werden. Unsere Linq-Abfragen werden vom Compiler in Lambda-Ausdrücke umgewandelt, welche dann im Endeffekt aufgerufen werden können.
2.5. Extension Methoden
Durch Erweiterungsmethoden ist die o.g. genannte Average()-Methode definiert. Extension Methods sind Methoden, welche auf einem Datentypen arbeiten und "dynamisch" Funktionen zu einem Datentypen hinzufügen. Bsp:
Imports StringUtility
Imports System.Runtime.CompilerServices
Namespace StringUtility
Module StringExtensions
<Extension()> _
Public Sub Print (ByVal aString As String)
Console.WriteLine(aString)
End Sub
End Module
End Namespace Die Methoden müssen Shared sein (hier impizit, da Definition in einem Modul erfolge) und mit dem Extension()-Attribute versehen werden. Als ersten Parameter wird der Typ angegeben, auf dem operiert werden soll. Evtl. weitere Parameter können folgen. Der Aufruf erfolgt so:
Dim text = "Hallo Welt!"
text.Print() Der Aufruf erfolgt wie bei einer Instanzmethode - über diesem Meschanismus sind auch die einzelnen Linq-Klauseln definiert und erweiterbar, wodurch mächtige Konstruktor einfach ausgedrückt werden können. Unser Beispiel ist noch einfach, enthält noch keine Joins etc, aber mit den bisherigen Mitteln wäre es nicht so elegant lösbar.
3. Kurze Bewertung und Ausblick
Linq ist eine interessante Neuerung im .NET Framework - die Idee selber ist nicht neu. Es wird das Arbeiten mit Daten verändern und setzt intensiv auf die in .NET 2.0 eingeführten Generics auf. Komplexe Abfragen werden leichter überblickbar und damit auch weniger fehleranfällig.
In den nächsten Tagen folgen meine Eindrücke zu Linq für SQL und XML, der Neuerungen in der IDE selber und welche Neuerungen ich (noch) in VB9 vermisse.
Viel Spaß beim Selber ausprobieren!
Ralf |