Grundlegende Abfrageoperationen (Visual Basic)
Aktualisiert: November 2007
Dieses Thema enthält eine kurze Einführung in Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)-Ausdrücke in Visual Basic und in einige der typischen Vorgänge bei einer Abfrage. Weitere Informationen finden Sie unter den folgenden Themen:
Einführung in LINQ in Visual Basic
Angeben der Datenquelle (From)
In einer LINQ-Abfrage ist der erste Schritt das Angeben der Datenquelle, für die eine Abfrage durchgeführt werden soll. Deshalb steht die From-Klausel in einer Abfrage immer zuerst. Abfrageoperatoren bestimmen das Ergebnis auf Grundlage des Quelltyps.
Dim query = From cust In customers _
' ...
Die From-Klausel gibt die Datenquelle, customers und die Bereichsvariablecust an. Die Bereichsvariable ist vergleichbar mit einer Schleifeniterationsvariablen, mit dem Unterschied, dass in einem Abfrageausdruck keine wirkliche Iteration stattfindet. Wenn die Abfrage ausgeführt wird, häufig durch Verwendung einer For Each-Schleife, dient die Bereichsvariable als Verweis auf jedes darauf folgende Element in customers. Da der Compiler den Typ von cust per Rückschluss ableiten kann, müssen Sie es nicht explizit angeben. Beispiele für Abfragen, die mit und ohne explizite Typisierung geschrieben werden, finden Sie unter Typbeziehungen in Abfrageoperationen (Visual Basic).
Weitere Informationen zur Verwendung der From-Klausel in Visual Basic finden Sie unter From-Klausel (Visual Basic).
Filtern von Daten (Where)
Die wahrscheinlich üblichste Abfrageoperation 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. Eine Where-Klausel wird verwendet, um die Filterung auszuführen. Der Filter gibt an, welche Elemente in der Datenquelle in der resultierenden Sequenz eingeschlossen werden sollen. Im folgenden Beispiel sind nur jene Kunden enthalten, die eine Adresse in London haben.
Dim londonCusts = From cust In customers _
Where cust.City = "London" _
' ...
Sie können logische Operatoren wie And and Or zum Kombinieren von Filterausdrücken in einer Where-Klausel verwenden. Um beispielsweise nur die Kunden zurückzugeben, die aus London stammen und den Namen Devon haben, verwenden Sie folgenden Code:
Where cust.City = "London" And cust.Name = "Devon" _
Um Kunden aus London oder Paris zurückzugeben, verwenden Sie den 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 (Visual Basic).
Sortieren von Daten (Order By)
Es ist oft praktisch, zurückgegebene Daten in einer bestimmten Reihenfolge zu sortieren. Mit der Order By-Klausel können die Elemente in der zurückgegebenen Sequenz anhand eines bestimmten Felds oder anhand bestimmter Felder sortiert werden. Zum Beispiel sortiert die folgende Abfrage die Ergebnisse auf Grundlage der Name-Eigenschaft. Da Name eine Zeichenfolge ist, werden die zurückgegebenen Daten alphabetisch sortiert, von A bis Z.
Dim londonCusts1 = From cust In customers _
Where cust.City = "London" _
Order By cust.Name Ascending _
' ...
Um die Ergebnisse in umgekehrter Reihenfolge zu sortieren (von Z bis A), verwenden Sie die Order By...Descending-Klausel. Der Standard ist Ascending, wenn weder Ascending noch Descending angegeben ist.
Weitere Informationen zur Verwendung der Order By-Klausel in Visual Basic finden Sie unter ORDER BY-Klausel (Visual Basic).
Auswählen von Daten (Select)
Die Select-Klausel gibt die Form und den Inhalt zurückgegebener Elemente an. Sie können beispielsweise angeben, ob Ihre Ergebnisse aus vollständigen Customer-Objekten bestehen, nur einer Customer-Eigenschaft, einer Teilmenge von Eigenschaften, einer Kombination von Eigenschaften aus verschiedenen Datenquellen oder einem neuen Ergebnistyp, der auf einer Berechnung basiert. Wenn die Select-Klausel ein anderes Ergebnis als eine Kopie des Quellelements zurückgibt, wird der 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 die 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 dies den Ergebnistyp aus einer Auflistung von Customer-Objekten in eine Auflistung von Zeichenfolgen ändert.
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 über diese Felder als Eigenschaften verfügt. Weitere Informationen finden Sie unter Anonyme Typen.
Da die zurückgegebenen Elemente im folgenden Beispiel Instanzen eines anonymen Typs sind, können Sie auf den Typ an anderer Stelle im Code nicht durch den Namen verweisen. Der vom Compiler festgelegte Name für den Typ enthält Zeichen, die in normalem Visual Basic-Code nicht gü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 die Instanzen des Typs in der Select-Klausel. Verwenden Sie diese Option nur, wenn Sie einzelne Ergebnisse außerhalb der Auflistung verwenden möchten, in der sie zurückgegeben werden, oder wenn Sie sie als Parameter in Methodenaufrufen übergeben müssen. Der Typ von londonCusts5 im folgenden Beispiel ist 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 (Visual Basic).
Verknüpfen von Daten (Join und Group Join)
Sie können mehr als eine Datenquelle in der From-Klausel auf mehrere Weisen kombinieren. Der folgende Code verwendet beispielsweise zwei Datenquellen und kombiniert deren Eigenschaften indirekt im Ergebnis. Die Abfrage wählt Studierende 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 in Gewusst wie: Erstellen einer Liste von Elementen erstellten Liste von Studierenden ausführen. |
Das Join-Schlüsselwort ist äquivalent zu einem INNER JOIN-Schlüsselwort in SQL. Es kombiniert zwei Auflistungen auf Grundlage von übereinstimmenden Schlüsselwerten in den beiden Auflistungen. Die Abfrage gibt alle oder nur einen Teil der Auflistungselemente zurück, die übereinstimmende Schlüsselwerte aufweisen. Im folgenden Code wird z. B. die Aktion der vorherigen impliziten Verknüpfung dupliziert.
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 in eine einzelne hierarchische Auflistung, genau wie ein LEFT JOIN-Schlüsselwort in SQL. Weitere Informationen finden Sie unter Join-Klausel (Visual Basic) und unter Group Join-Klausel (Visual Basic).
Gruppieren von Daten (Group By)
Sie können eine Group By-Klausel hinzufügen, um die Elemente in einem Abfrageergebnis gemäß einem oder mehreren Feldern von Elementen zu gruppieren. Zum Beispiel werden mit dem folgenden Code Studierende anhand des Jahrgangs gruppiert.
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 in Gewusst wie: Erstellen einer Liste von Elementen erstellten Liste der Studierenden ausführen, lautet die Ausgabe der For Each-Anweisung:
Jahr: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Jahr: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Jahr: Freshman (Student im ersten Jahr)
Mortensen, Sven
Garcia, Cesar
Mit der folgenden Codevariation werden die Jahrgänge sortiert und anschließend die Studierenden innerhalb des Jahrgangs nach Nachname.
Dim studentsByYear2 = From student In students _
Select student _
Order By student.Year, student.Last _
Group By year = student.Year _
Into Classes = Group
Weitere Informationen über Group By finden Sie unter GROUP BY-Klausel (Visual Basic).
Siehe auch
Aufgaben
Beispielabfragen (Visual Basic)
Konzepte
Übersicht über Standardabfrageoperatoren