Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Name Language-Integrated Query (LINQ) bezieht sich auf die Technologie in Visual Basic, die Abfragesyntax und andere Sprachkonstrukte direkt in der Sprache unterstützt. Mit LINQ müssen Sie keine neue Sprache erlernen, um eine Abfrage für eine externe Datenquelle auszuführen. Sie können Daten in relationalen Datenbanken, XML-Speicher oder Objekten mithilfe von Visual Basic abfragen. Diese Integration von Abfragefunktionen in die Sprache ermöglicht die Kompilierungszeitüberprüfung auf Syntaxfehler und Typsicherheit. Diese Integration stellt außerdem sicher, dass Sie bereits wissen, was Sie kennen müssen, um umfangreiche, unterschiedliche Abfragen in Visual Basic zu schreiben.
In den folgenden Abschnitten werden die Sprachkonstrukte beschrieben, die LINQ ausführlich unterstützen, damit Sie mit dem Lesen der einführungsdokumentation, Codebeispiele und Beispielanwendungen beginnen können. Sie können auch auf die Links klicken, um ausführlichere Erläuterungen darüber zu finden, wie die Sprachfeatures zusammenkommen, um sprachintegriert abfragen zu können. Einen guten Ausgangspunkt bietet die exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic.
Abfrageausdrücke
Abfrageausdrücke in Visual Basic können in einer deklarativen Syntax ausgedrückt werden, die dem von SQL oder XQuery ähnelt. Zur Kompilierzeit wird die Abfragesyntax in Methodenaufrufe an eine Implementierung des LINQ-Anbieters der Erweiterungsmethoden des Standardabfrageoperators kompiliert. Anwendungen steuern, welche Standardabfrageoperatoren im Geltungsbereich sind, indem sie den entsprechenden Namespace mit einem Imports Ausdruck angeben. 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 eingegebene Variablen
Anstatt einen Typ explizit anzugeben, wenn Sie eine Variable deklarieren und initialisieren, können Sie den Compiler aktivieren, um den Typ abzuleiten und zuzuweisen. Dies wird als lokale Typ-Ableitung bezeichnet.
Variablen, deren Typen abgeleitet werden, werden stark typisiert, genau wie Variablen, deren Typ Sie explizit angeben. Lokale Typinference funktioniert nur, wenn Sie eine lokale Variable innerhalb eines Methodentexts definieren. Weitere Informationen finden Sie unter Option Infer Statement and Local Type Inference.
Im folgenden Beispiel wird die Lokale Typinferenz veranschaulicht. Um dieses Beispiel zu verwenden, müssen Sie Option Infer auf On einstellen.
' The variable aNumber will be typed as an integer.
Dim aNumber = 5
' The variable aName will be typed as a String.
Dim aName = "Virginia"
Lokale Typinference ermöglicht auch das Erstellen anonymer Typen, die weiter unten in diesem Abschnitt beschrieben werden und für LINQ-Abfragen erforderlich sind.
Im folgenden LINQ-Beispiel tritt die Typinferenz auf, wenn Option Infer entweder On oder Off ist. Ein Kompilierungszeitfehler tritt auf, wenn Option InferOff ist und Option StrictOn ist.
' 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 Sie einen anonymen Typ erstellen müssen, um die Ergebnisse einer Abfrage zu enthalten. Sie können auch verwendet werden, um Objekte benannter Typen außerhalb von Abfragen zu initialisieren. Mithilfe eines Objektinitialisierers können Sie ein Objekt in einer einzelnen Zeile initialisieren, ohne einen Konstruktor explizit aufzurufen. Angenommen, Sie haben eine Klasse namens Customer, die über öffentliche Name und Phone-Eigenschaften sowie andere Eigenschaften verfügt, kann ein Objektinitialisierer auf diese Weise verwendet werden:
Dim aCust = New Customer With {.Name = "Mike",
.Phone = "555-0212"}
Weitere Informationen finden Sie unter Object Initializers: Named and Anonymous Types.
Anonyme Typen
Anonyme Typen bieten eine bequeme Möglichkeit, einen Satz von Eigenschaften vorübergehend in ein Element zu gruppieren, das Sie in ein Abfrageergebnis aufnehmen möchten. Auf diese Weise können Sie eine beliebige Kombination der verfügbaren Felder in der Abfrage in beliebiger Reihenfolge 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. Daher kann der Name nicht direkt verwendet werden. Anonyme Typen werden wie folgt 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 von außerhalb der Definition Methoden hinzufügen. Mit diesem Feature können Sie einem vorhandenen Typ neue Methoden hinzufügen, ohne den Typ tatsächlich zu ändern. Die Standardabfrageoperatoren sind selbst eine Reihe von Erweiterungsmethoden, die LINQ-Abfragefunktionen für jeden Typ bereitstellen, der IEnumerable<T> implementiert. Weitere Erweiterungen zu IEnumerable<T> gehören Count, Union und Intersect.
Die folgende Erweiterungsmethode fügt der String Klasse eine Druckmethode hinzu.
' 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 eine gewöhnliche Instanzmethode von String aufgerufen:
Dim greeting As String = "Hello"
greeting.Print()
Weitere Informationen finden Sie unter Erweiterungsmethoden.
Lambda-Ausdrücke
Ein Lambda-Ausdruck ist eine Funktion ohne Namen, die einen einzelnen Wert berechnet und zurückgibt. 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 Lambda-Ausdrucksdefinition einem Variablennamen zuweisen und dann den Namen verwenden, um die Funktion aufzurufen. Im folgenden Beispiel wird auch 4 angezeigt.
Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))
In LINQ liegen Lambda-Ausdrücke vielen der Standardabfrageoperatoren zugrunde. Der Compiler erstellt Lambda-Ausdrücke, um die Berechnungen zu erfassen, die in grundlegenden Abfragemethoden wie Where, , Select, Order Byund Take Whileanderen definiert sind.
Der folgende Code definiert z. B. eine Abfrage, die alle senioren Kursteilnehmer aus einer Liste von Kursteilnehmern zurückgibt.
Dim seniorsQuery = From stdnt In students
Where stdnt.Year = "Senior"
Select stdnt
Die Abfragedefinition wird in Code kompiliert, der ähnlich wie das folgende Beispiel aussieht und zwei Lambda-Ausdrücke verwendet, um die Argumente für Where und Select festzulegen.
Dim seniorsQuery2 = students.
Where(Function(st) st.Year = "Senior").
Select(Function(s) s)
Beide Versionen können mithilfe 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.