Grundlegende Abfrageoperationen (Visual Basic)
In diesem Thema finden Sie eine Einführung in LINQ-Ausdrücke (Language Integrated Query) in Visual Basic sowie einige der geläufigsten Vorgänge, die Sie in einer Abfrage durchführen können. Weitere Informationen finden Sie in den folgenden Themen:
Einführung in LINQ in Visual Basic
Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic
Angeben der Datenquelle (From-Klausel)
Der erste Schritt für eine LINQ-Abfrage ist das Festlegen der abzufragenden Datenquelle. Daher steht die From
-Klausel in einer Abfrage immer an erster Stelle. Abfrageoperatoren wählen das Ergebnis basierend auf dem Typ der Quelle aus und gestalten es.
Dim query = From cust In customers
' ...
Die From
-Klausel gibt die Datenquelle (customers
) und die Bereichsvariable (cust
) an. Die Bereichsvariable ähnelt einer Schleifeniterationsvariable, mit dem Unterschied, dass in einem Abfrageausdruck keine Iterationen vorkommen. Wenn die Abfrage ausgeführt wird – häufig in einer For Each
-Schleife –, fungiert die Bereichsvariable als Verweis auf jedes aufeinanderfolgende Element in customers
. Es ist nicht notwendig, diese explizit anzugeben, da der Compiler den Typ von cust
ableitet. Beispiele für Abfragen, die mit und ohne explizite Typisierung geschrieben wurden, finden Sie unter Typbeziehungen in Abfragevorgängen (Visual Basic).
Weitere Informationen zur Verwendung der From
-Klausel in Visual Basic finden Sie unter From-Klausel.
Filtern von Daten (Where-Klausel)
Der wahrscheinlich häufigste Abfragevorgang ist das Anwenden eines Filters in Form eines booleschen Ausdrucks. Die Abfrage gibt dann nur jene Elemente zurück, für die der Ausdruck den Wert TRUE hat. Zum Durchführen der Filterung wird eine Where
-Klausel verwendet. Der Filter gibt an, welche Elemente in der Datenquelle in die resultierende Sequenz einbezogen werden sollen. Im folgenden Beispiel werden nur die Kund*innen eingeschlossen, die eine Londoner Adresse haben.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
Sie können auch logische Operatoren wie And
und Or
zum Kombinieren von Filterausdrücken in einer Where
-Klausel verwenden. Verwenden Sie beispielsweise den folgenden Code, um nur die Kund*innen zurückzugeben, die aus London stammen und deren Name „Devon“ lautet:
Where cust.City = "London" And cust.Name = "Devon"
Um Kund*innen aus London oder Paris zurückzugeben, verwenden Sie folgenden Code:
Where cust.City = "London" Or cust.City = "Paris"
Weitere Informationen zur Verwendung der Where
-Klausel in Visual Basic finden Sie unter Where-Klausel.
Bestelldaten (Order By-Klausel)
Häufig ist es praktisch, zurückgegebene Daten in einer bestimmten Reihenfolge zu sortieren. Die Order By
-Klausel bewirkt, dass die Elemente in der zurückgegebenen Sequenz nach einem oder mehreren angegebenen Feldern sortiert werden. Die folgende Abfrage sortiert die Ergebnisse z. B. nach der Name
-Eigenschaft. Da Name
eine Zeichenfolge ist, werden die zurückgegebenen Daten alphabetisch von A nach Z sortiert.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Wenn Sie die Ergebnisse andersherum, von Z bis A, sortieren möchten, können Sie die Order By...Descending
-Klausel verwenden. Wenn weder Ascending
noch Descending
angegeben werden, lautet der Standardwert Ascending
.
Weitere Informationen zur Verwendung der Order By
-Klausel in Visual Basic finden Sie unter Order By-Klausel.
Auswählen von Daten (Select-Klausel)
Die Select
-Klausel gibt die Form und den Inhalt der zurückgegebenen Elemente an. Sie können beispielsweise angeben, ob Ihre Ergebnisse aus vollständigen Customer
-Objekten, nur einer Customer
-Eigenschaft, einer Teilmenge von Eigenschaften, einer Kombination aus Eigenschaften aus verschiedenen Datenquellen oder einem neuen Ergebnistyp basierend auf einer Berechnung bestehen. Wenn die Select
-Klausel etwas anderes als eine Kopie des Quellelements erzeugt, wird dieser Vorgang als Projektion bezeichnet.
Um eine Auflistung abzurufen, die aus vollständigen Customer
-Objekten besteht, wählen Sie die Bereichsvariable selbst aus:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Wenn ein Customer
-Instanz ein großes Objekt mit vielen Feldern ist und Sie nur den Namen abrufen möchten, können Sie cust.Name
auswählen, wie im folgenden Beispiel gezeigt. Der lokale Typrückschluss erkennt, dass der Ergebnistyp dadurch von einer Auflistung von Customer
-Objekten in eine Auflistung von Zeichenfolgen geändert wird.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Um mehrere Felder aus der Datenquelle auszuwählen, haben Sie zwei Möglichkeiten:
Geben Sie in der
Select
-Klausel die Felder an, die Sie in das Ergebnis einschließen möchten. Der Compiler definiert einen anonymen Typ, der diese Felder als Eigenschaften besitzt. Weitere Informationen finden Sie unter Anonyme Typen.Da es sich bei den zurückgegebenen Elementen im folgenden Beispiel um Instanzen eines anonymen Typs handelt, können Sie an anderer Stelle im Code nicht anhand des Namens auf den Typ verweisen. Der vom Compiler festgelegte Name für den Typ enthält Zeichen, die in normalem Visual Basic-Code ungültig sind. Im folgenden Beispiel sind die Elemente in der Auflistung, die von der Abfrage in
londonCusts4
zurückgegeben werden, Instanzen eines anonymen Typs.Dim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
Oder
Definieren Sie einen benannten Typ, der die Felder enthält, die Sie in das Ergebnis einschließen möchten, und erstellen und initialisieren Sie anschließend in der
Select
-Klausel Instanzen des Typs. Verwenden Sie diese Option nur, wenn Sie einzelne Ergebnisse außerhalb der Auflistung verwenden müssen, in der sie zurückgegeben werden, oder wenn Sie sie als Parameter in Methodenaufrufen übergeben müssen. Der Typ vonlondonCusts5
ist im folgenden Beispiel „IEnumerable(Of NamePhone)“.Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Weitere Informationen zur Verwendung der Select
-Klausel in Visual Basic finden Sie unter Select-Klausel.
Verknüpfen von Daten (Join- und Group Join-Klausel)
Sie können mehrere Datenquellen in der From
-Klausel auf verschiedene Arten kombinieren. Der folgende Code verwendet beispielsweise zwei Datenquellen und kombiniert im Ergebnis implizit Eigenschaften aus beiden. Die Abfrage wählt Schüler*innen aus, deren Nachnamen mit einem Vokal beginnen.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Hinweis
Sie können diesen Code mit der Liste der Schüler*innen ausführen, die unter Erstellen einer Liste von Elementen erstellt wurde.
Das Schlüsselwort Join
ist äquivalent zu INNER JOIN
in SQL. Es kombiniert zwei Auflistungen basierend auf übereinstimmenden Schlüsselwerten zwischen den Elementen in den beiden Auflistungen. Die Abfrage gibt alle oder einen Teil der Auflistungselemente zurück, die übereinstimmende Schlüsselwerte aufweisen. Der folgende Code dupliziert beispielsweise die Aktion der vorherigen impliziten Verknüpfung.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
kombiniert Auflistungen (wie LEFT JOIN
in SQL) in einer einzigen hierarchischen Auflistung. Weitere Informationen finden Sie unter Join-Klausel und Group Join-Klausel.
Gruppieren von Daten (Group By-Klausel)
Sie können eine Group By
-Klausel hinzufügen, um die Elemente in einem Abfrageergebnis nach einem oder mehreren Feldern der Elemente zu gruppieren. Der folgende Code gruppiert z. B. die Schüler*innen nach Klassenstufe.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Wenn Sie diesen Code mit der Liste der Schüler*innen ausführen, die unter Erstellen einer Liste von Elementen erstellt wurde, gibt die For Each
-Anweisung Folgendes aus:
Year: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Year: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Year: Freshman
Mortensen, Sven
Garcia, Cesar
Die im folgenden Code gezeigte Variante sortiert zunächst die Klassenstufen und anschließend die Schüler*innen der einzelnen Klassenstufen nach dem Nachnamen.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Weitere Informationen zu Group By
finden Sie unter Group By-Klausel.