vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Allgemeine Diskussionen
Erfahrungen mit VB Orcas - Part 2 
Autor: Moderatorralf_oop (Moderator)
Datum: 22.04.07 00:42

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

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Erfahrungen mit VB Orcas - Part 11.014Moderatorralf_oop22.04.07 00:41
Erfahrungen mit VB Orcas - Part 2516Moderatorralf_oop22.04.07 00:42
Re: Erfahrungen mit VB Orcas - Part 2477Dennisf23.04.07 16:58
Re: Erfahrungen mit VB Orcas - Part 2492Moderatorralf_oop23.04.07 17:43

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel