Visual Basic-Features, die LINQ unterstützen

Der Begriff Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) bezieht sich auf eine Technologie in Visual Basic, die Abfragesyntax und andere Sprachkonstrukte direkt in der Programmiersprache unterstützt. Bei LINQ ist es nicht erforderlich, eine neue Programmiersprache zu erlernen, um Abfragen gegen eine externe Datenquelle auszuführen. Sie können Daten in relationalen Datenbanken, XML-Speichern oder Objekten mithilfe von Visual Basic abfragen. Diese Integration von Abfragefunktionen in die Programmiersprache ermöglicht die Suche nach Syntaxfehlern zur Kompilierzeit und bietet Typsicherheit. Außerdem wird durch diese Integration sichergestellt, dass Ihnen die meisten Informationen, die Sie zum Schreiben umfangreicher, vielseitiger Abfragen in Visual Basic benötigen, bereits bekannt sind.

In den folgenden Abschnitten werden die neuen Sprachkonstrukte beschrieben, die LINQ unterstützten, um Ihnen den Einstieg in die einführende Dokumentation sowie in Codebeispiele und Beispielanwendungen zu erleichtern. Sie können auch auf die Links klicken, um genau zu erfahren, wie die Sprachfeatures zur Unterstützung der sprachintegrierten Abfrage (Language-Integrated Query, LINQ) zusammenspielen. Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic bietet einen guten Einstiegspunkt.

Abfrageausdrücke

Abfrageausdrücke in Visual Basic können ähnlich wie in SQL oder XQuery in einer deklarativen Syntax ausgedrückt werden. Eine Abfragesyntax wird zur Kompilierzeit in Methodenaufrufe für eine LINQ-Anbieterimplementierung der standardmäßigen Abfrageoperator-Erweiterungsmethoden umgewandelt. Anwendungen steuern, welche Standardabfrageoperatoren sich innerhalb des Bereichs befinden, indem der entsprechende Namespace mit einer Imports-Anweisung angegeben wird. Die Syntax für einen Visual Basic-Abfrageausdruck sieht wie folgt aus:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Weitere Informationen finden Sie unter Einführung in LINQ in Visual Basic.

Implizit typisierte Variablen

Anstatt beim Deklarieren und Initialisieren einer Variablen einen Typ explizit anzugeben, können Sie den Compiler zum Ableiten und Zuweisen des Typs veranlassen. Dies wird als lokaler Typrückschluss bezeichnet.

Variables mit abgeleiteten Typen sind ebenso wie Variablen, deren Typ explizit angegeben wird, stark typisiert. Der lokale Typrückschluss funktioniert nur, wenn Sie in einem Methodentext eine lokale Variable definieren. Weitere Informationen finden Sie unter Option Infer-Anweisung und Lokaler Typrückschluss (Visual Basic).

Im folgenden Beispiel wird der lokalen Typrückschluss veranschaulicht. Um dieses Beispiel zu verwenden, müssen Sie Option Infer auf On festlegen.

' The variable number will be typed as an integer.
Dim aNumber = 5

' The variable name will be typed as a String.
Dim aName = "Virginia"

Der lokale Typrückschluss ermöglicht außerdem, anonyme Typen zu erstellen. Diese werden im weiteren Verlauf dieses Thema beschrieben werden und sind für LINQ-Abfragen erforderlich.

Im folgenden LINQ-Beispiel erfolgt ein Typrückschluss, wenn Option Infer den Wert On oder Off aufweist. Wenn Option Infer gleich Off und Option Strict gleich On ist, tritt ein Kompilierungsfehler auf.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

Objektinitialisierer

Objektinitialisierer werden in Abfrageausdrücken verwendet, wenn ein anonymer Typ für die Aufnahme der Ergebnisse einer Abfrage erstellt werden muss. Sie können auch verwendet werden, um Objekte benannter Typen außerhalb von Abfragen zu initialisieren. Mit einem Objektinitialisierer können Sie ein Objekt in einer einzelnen Zeile initialisieren, ohne einen Konstruktor explizit aufzurufen. Beispiel: Bei einer Klasse mit dem Namen Customer, die neben anderen Eigenschaften über die öffentliche Name-Eigenschaft und die öffentliche Phone-Eigenschaft verfügt, kann der Objektinitialisierer auf folgende Weise verwendet werden:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen (Visual Basic).

Anonyme Typen

Mit anonymen Typen können Eigenschaftensätze auf praktische Weise vorübergehend in einem Element gruppiert werden, das Sie in ein Abfrageergebnis aufnehmen möchten. Auf diese Weise können Sie eine beliebige Kombination verfügbarer Felder in beliebiger Reihenfolge in der Abfrage auswählen, ohne einen benannten Datentyp für das Element zu definieren.

Ein anonymer Typ wird dynamisch vom Compiler erstellt. Der Name des Typs wird vom Compiler zugewiesen und kann sich bei jeder neuen Kompilierung ändern. Deshalb kann der Name nicht direkt verwendet werden. Anonyme Typen werden auf folgende Weise initialisiert:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Weitere Informationen finden Sie unter Anonyme Typen (Visual Basic).

Erweiterungsmethoden

Mit Erweiterungsmethoden können Sie einem Datentyp oder einer Schnittstelle Methoden außerhalb der Definition hinzufügen. Dieses Feature ermöglicht Ihnen im Prinzip, einem vorhandenen Typ neue Methoden hinzuzufügen, ohne den Typ tatsächlich zu ändern. Die Standardabfrageoperatoren selbst stellen eine Reihe von Erweiterungsmethoden dar, die LINQ-Abfragefunktionen für jeden Typ bieten, der IEnumerable<T> implementiert. Andere Erweiterungen für IEnumerable<T> umfassen Count, Union und Intersect.

Durch die folgende Erweiterungsmethode wird der String-Klasse eine Print-Methode hinzugefügt.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
    Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

Die Methode wird wie jede normale Instanzenmethode von String aufgerufen:

Dim greeting As String = "Hello"
greeting.Print()

Weitere Informationen finden Sie unter Erweiterungsmethoden (Visual Basic).

Lambda-Ausdrücke

Ein Lambda-Ausdruck ist eine Funktion ohne Namen, von der ein einzelner Wert berechnet und zurückgegeben wird. Im Gegensatz zu benannten Funktionen kann ein Lambda-Ausdruck gleichzeitig definiert und ausgeführt werden. Im folgenden Beispiel wird 4 angezeigt.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Sie können die Definition des Lambda-Ausdrucks einem Variablennamen zuweisen und die Funktion anschließend mithilfe des Namens aufrufen. Im folgenden Beispiel wird ebenfalls 4 angezeigt.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

In LINQ liegen vielen der Standardabfrageoperatoren Lambda-Ausdrücke zugrunde. Lambda-Ausdrücke werden vom Compiler erstellt, um Berechnungen zu erfassen, die in grundlegenden Abfragemethoden wie Where, Select, Order By, Take While usw. definiert sind.

Im folgenden Code wird beispielsweise eine Abfrage definiert, die aus einer Liste von Studenten alle Studenten im Abschlussjahr zurückgibt.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

Die Abfragedefinition wird in mit dem folgenden Beispiel vergleichbaren Code kompiliert, in dem zwei Lambda-Ausdrücke verwendet werden, um die Argumente für Where und Select anzugeben.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Beide Versionen können unter Verwendung einer For Each-Schleife ausgeführt werden:

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Weitere Informationen finden Sie unter Lambda-Ausdrücke (Visual Basic).

Siehe auch

Referenz

Option Infer-Anweisung

Option Strict-Anweisung

Konzepte

LINQ und Zeichenfolgen

C#-Funktionen mit LINQ-Unterstützung

Weitere Ressourcen

LINQ (Language-Integrated Query, sprachintegrierte Abfrage)

Erste Schritte mit LINQ in Visual Basic

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Mai 2011

Abschnitt "Implizit typisierte Variablen" bearbeitet.

Korrektur inhaltlicher Fehler.