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 hierzu 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 aNumber will be typed as an integer.
Dim aNumber = 5
' The variable aName will be typed as a String.
Dim aName = "Virginia"
Lokaler Typrückschluss ist es auch möglich, dass anonyme Typen zu erstellen, die weiter unten in diesem Abschnitt beschrieben werden, und für LINQ-Abfragen erforderlich sind.
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
Konzepte
C#-Funktionen mit LINQ-Unterstützung