Freigeben über


Visual Basic-Features, die LINQ unterstützen

Aktualisiert: November 2007

Der Begriff Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) bezieht sich auf eine neue Technologie in Visual Basic 2008, die Abfragesyntax und andere neue 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 2008 benötigen, bereits bekannt sind.

In den folgenden Abschnitten werden die neuen Sprachkonstrukte ausführlicher beschrieben, 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 2008 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 jetzt den Compiler zum Ableiten und Zuweisen des Typs veranlassen, wie im folgenden Beispiel dargestellt. Dies wird als lokaler Typrückschluss bezeichnet.

Hinweis:

Der lokale Typrückschluss funktioniert nur, wenn Sie eine lokale Variable innerhalb eines Methodentexts definieren, während Option Infer auf On festgelegt ist. On entspricht dem Standardwert für neue Projekte in LINQ. Weitere Informationen finden Sie unter Option Infer-Anweisung.

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

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

In Visual Basic 2005 und früheren Versionen werden diese Beispiele zwar kompiliert, der aNumber und aName zugewiesene Typ lautet jedoch Object. Daher kann ein vorhandenes Projekt, das in Visual Basic 2008 mit der Einstellung Option Infer = On neu kompiliert wird, ein anderes Verhalten als in früheren Sprachversionen aufweisen.

' 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

Auf diese Weise deklarierte Variablen sind ebenso stark typisiert wie Variablen, deren Typ Sie explizit angeben. Der lokale Typrückschluss ermöglicht die Erstellung von anonymen, für LINQ-Abfragen erforderlichen Typen, kann aber auch für beliebige lokale Variablen verwendet werden.

Weitere Informationen finden Sie unter Lokaler Typrückschluss.

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 As Customer = New Customer With {.Name = "Mike", _
                                           .Phone = "555-0212"}

Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen.

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.

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.

Siehe auch

Aufgaben

Beispielabfragen (Visual Basic)

Konzepte

LINQ und Zeichenfolgen

Weitere Ressourcen

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)

Erste Schritte mit LINQ in Visual Basic