Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Sie Features von Visual Basic zum Schreiben von LINQ-Abfrageausdrücken (Language Integrated Query) verwenden. In der exemplarischen Vorgehensweise wird gezeigt, wie Abfragen für eine Liste von Student-Objekten erstellt, ausgeführt und geändert werden. Die Abfragen nutzen mehrere Features, darunter Objektinitialisierer, lokale Typrückschlüsse und anonyme Typen.
Nach Abschluss dieser exemplarischen Vorgehensweise können Sie mit den Beispielen und der Dokumentation für den jeweiligen LINQ-Anbieter fortfahren, an dem Sie interessiert sind. Zu den LINQ-Anbietern gehören LINQ to SQL, LINQ to DataSet und LINQ to XML.
Erstellen eines Projekts
So erstellen Sie ein Konsolenanwendungsprojekt
Starten Sie Visual Studio.
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Wählen Sie in der Liste Installierte Vorlagen die Option Visual Basic aus.
Wählen Sie in der Liste der Projekttypen Konsolenanwendung aus. Geben Sie im Feld Name einen Namen für das Projekt ein, und wählen Sie dann OK aus.
Es wird ein Projekt erstellt. Standardmäßig enthält es einen Verweis auf „System.Core.dll“. Außerdem enthält die Liste Importierte Namespaces auf der Seite „Verweise“ im Projekt-Designer (Visual Basic) den System.Linq-Namespace.
Stellen Sie auf der Seite „Kompilieren“ im Projekt-Designer (Visual Basic) sicher, dass Option infer auf Ein festgelegt ist.
Erstellen einer arbeitsspeicherinternen Datenquelle
Die Datenquelle für die Abfragen in dieser exemplarischen Vorgehensweise ist eine Liste mit Student
-Objekten. Jedes Student
-Objekt enthält einen Vornamen, einen Nachnamen, eine Klassenstufe und einen akademischen Rang in der Schülerschaft.
So fügen Sie die Datenquelle hinzu
Definiert Sie eine
Student
-Klasse, und erstellen Sie eine Liste von Instanzen der Klasse.Wichtig
Sie finden den zum Definieren der
Student
-Klasse und zum Erstellen der Liste in den Beispielen der exemplarischen Vorgehensweise erforderlichen Code unter Erstellen einer Liste von Elementen. Sie können ihn von dort kopieren und in Ihr Projekt einfügen. Der neue Code ersetzt den Code, der beim Erstellen des Projekts bereits vorhanden war.
So fügen Sie der Liste der Lernenden neue Schulkinder hinzu
- Befolgen Sie das Muster in der
getStudents
-Methode, um der Liste eine weitere Instanz derStudent
-Klasse hinzuzufügen. Beim Hinzufügen von Schulkindern erhalten Sie eine Einführung in Objektinitialisierer. Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen.
Erstellen einer Abfrage
Bei der Ausführung erzeugt die in diesem Abschnitt hinzugefügte Abfrage eine Liste der Schulkinder, deren akademischer Rang unter den ersten zehn liegt. Da die Abfrage jedes Mal das vollständige Student
-Objekt auswählt, ist der Typ des Abfrageergebnisses IEnumerable(Of Student)
. Der Typ der Abfrage wird jedoch in der Regel nicht in Abfragedefinitionen angegeben. Stattdessen verwendet der Compiler lokale Typrückschlüsse, um den Typ zu bestimmen. Weitere Informationen finden Sie unter Lokaler Typrückschluss. Die Bereichsvariable der Abfrage (currentStudent
) dient als Verweis auf die einzelnen Student
-Instanzen in der Quelle (students
) und bietet Zugriff auf die Eigenschaften jedes Objekts in students
.
So erstellen Sie eine einfache Abfrage
Suchen Sie in der
Main
-Methode des Projekts die Stelle, die wie folgt gekennzeichnet ist:' ****Paste query and query execution code from the walkthrough, ' ****or any code of your own, here in Main.
Kopieren Sie folgenden Code, und fügen Sie ihn ein.
Dim studentQuery = From currentStudent In students Where currentStudent.Rank <= 10 Select currentStudent
Zeigen Sie mit dem Mauszeiger im Code auf
studentQuery
, um zu überprüfen, ob der vom Compiler zugewiesene TypIEnumerable(Of Student)
ist.
Ausführen der Abfrage
Die Variable studentQuery
enthält die Definition der Abfrage, nicht die Ergebnisse der Ausführung der Abfrage. Abfragen werden häufig innerhalb einer For Each
-Schleife ausgeführt. Auf die einzelnen Elemente in der zurückgegebenen Sequenz wird über die Iterationsvariable in der Schleife zugegriffen. Weitere Informationen zur Abfrageausführung finden Sie unter Schreiben der ersten LINQ-Abfrage (Visual Basic).
So führen Sie die Abfrage aus
Fügen Sie die folgende
For Each
-Schleife in Ihrem Projekt unterhalb der Abfrage hinzu.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Zeigen Sie mit dem Mauszeiger auf die Schleifensteuervariable
studentRecord
, um deren Datentyp anzuzeigen. Als Typ vonstudentRecord
wirdStudent
abgeleitet, dastudentQuery
eine Auflistung vonStudent
-Instanzen zurückgibt.Drücken Sie STRG+F5, um die Anwendung zu erstellen und auszuführen. Beachten Sie die Ergebnisse im Konsolenfenster.
Ändern der Abfrage
Es ist einfacher, Abfrageergebnisse zu überprüfen, wenn sie sich in einer festgelegten Reihenfolge befinden. Sie können die zurückgegebene Sequenz basierend auf jedem verfügbaren Feld sortieren.
So sortieren Sie die Ergebnisse
Fügen Sie die folgende
Order By
-Klausel zwischen derWhere
-Anweisung und derSelect
-Anweisung der Abfrage hinzu. DieOrder By
-Klausel ordnet die Ergebnisse in alphabetischer Reihenfolge (A bis Z) nach dem Nachnamen der Schulkinder.Order By currentStudent.Last Ascending
Um nach Nachname und dann nach Vornamen zu sortieren, fügen Sie der Abfrage beide Felder hinzu:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
Sie können auch
Descending
angeben, um von Z nach A zu sortieren.Drücken Sie STRG+F5, um die Anwendung zu erstellen und auszuführen. Beachten Sie die Ergebnisse im Konsolenfenster.
So führen Sie einen lokalen Bezeichner ein
Fügen Sie den Code in diesem Abschnitt hinzu, um im Abfrageausdruck einen lokalen Bezeichner einzuführen. Der lokale Bezeichner dient zur Speicherung eines Zwischenergebnisses. Im folgenden Beispiel ist
name
ein Bezeichner, der eine Verkettung des Vor- und Nachnamens der einzelnen Schulkinder enthält. Ein lokaler Bezeichner dient zur Vereinfachung. Er kann aber auch die Leistung steigern, indem die Ergebnisse eines Ausdrucks gespeichert werden, sodass diese nicht mehrfach berechnet werden müssen.Dim studentQuery2 = From currentStudent In students Let name = currentStudent.Last & ", " & currentStudent.First Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 Order By name Ascending Select currentStudent ' If you see too many results, comment out the previous ' For Each loop. For Each studentRecord In studentQuery2 Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Drücken Sie STRG+F5, um die Anwendung zu erstellen und auszuführen. Beachten Sie die Ergebnisse im Konsolenfenster.
So projizieren Sie ein Feld in der Select-Klausel
Fügen Sie die Abfrage und die
For Each
-Schleife aus diesem Abschnitt hinzu, um eine Abfrage zu erstellen, die eine Sequenz generiert, deren Elemente sich von den Elementen in der Quelle unterscheiden. Im folgenden Beispiel ist die Quelle eine Auflistung vonStudent
-Objekten, wobei aber nur ein Element jedes Objekts zurückgegeben wird: der Vorname von Schulkindern, deren Nachname Garcia lautet. DacurrentStudent.First
eine Zeichenfolge ist, hat die vonstudentQuery3
zurückgegebene Sequenz den DatentypIEnumerable(Of String)
– eine Sequenz von Zeichenfolgen. Wie in früheren Beispielen bleibt die Zuweisung eines Datentyps fürstudentQuery3
dem Compiler überlassen, der ihn über den lokalen Typrückschluss bestimmt.Dim studentQuery3 = From currentStudent In students Where currentStudent.Last = "Garcia" Select currentStudent.First ' If you see too many results, comment out the previous ' For Each loops. For Each studentRecord In studentQuery3 Console.WriteLine(studentRecord) Next
Zeigen Sie mit dem Mauszeiger im Code auf
studentQuery3
, um zu überprüfen, ob der zugewiesene TypIEnumerable(Of String)
ist.Drücken Sie STRG+F5, um die Anwendung zu erstellen und auszuführen. Beachten Sie die Ergebnisse im Konsolenfenster.
So erstellen Sie einen anonymen Typ in der Select-Klausel
Fügen Sie den Code aus diesem Abschnitt hinzu, um zu sehen, wie anonyme Typen in Abfragen verwendet werden. Sie verwenden sie in Abfragen, wenn Sie anstelle vollständiger Datensätze (
currentStudent
-Datensätze in vorherigen Beispielen) oder einzelner Felder (First
im vorherigen Abschnitt) mehrere Felder aus der Datenquelle zurückgeben möchten. Anstatt einen neuen benannten Typ zu definieren, der die Felder enthält, die Sie in das Ergebnis einschließen möchten, geben Sie die Felder in derSelect
-Klausel an. Der Compiler erstellt daraufhin einen anonymen Typ mit diesen Feldern als Eigenschaften. Weitere Informationen finden Sie unter Anonyme Typen.Im folgenden Beispiel wird eine Abfrage erstellt, die den Namen und den Rang von Oberstufenschüler*innen, deren akademischer Rang zwischen 1 und 10 liegt, in der Reihenfolge des akademischen Rangs zurückgibt. In diesem Beispiel muss der Typ von
studentQuery4
abgeleitet werden, da dieSelect
-Klausel eine Instanz eines anonymen Typs zurückgibt und ein anonymer Typ keinen verwendbaren Namen hat.Dim studentQuery4 = From currentStudent In students Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 Order By currentStudent.Rank Ascending Select currentStudent.First, currentStudent.Last, currentStudent.Rank ' If you see too many results, comment out the previous ' For Each loops. For Each studentRecord In studentQuery4 Console.WriteLine(studentRecord.Last & ", " & studentRecord.First & ": " & studentRecord.Rank) Next
Drücken Sie STRG+F5, um die Anwendung zu erstellen und auszuführen. Beachten Sie die Ergebnisse im Konsolenfenster.
Zusätzliche Beispiele
Nachdem Sie sich nun mit den Grundlagen vertraut gemacht haben, finden Sie im Folgenden eine Liste mit zusätzlichen Beispielen, die die Flexibilität und Leistungsfähigkeit von LINQ-Abfragen veranschaulichen. Jedem Beispiel ist eine Kurzbeschreibung der Funktionsweise vorangestellt. Zeigen Sie mit dem Mauszeiger auf die Variable mit dem Ergebnis für die einzelnen Abfragen, um den abgeleiteten Typ anzuzeigen. Verwenden Sie eine For Each
-Schleife, um die Ergebnisse zu generieren.
' Find all students who are seniors.
Dim q1 = From currentStudent In students
Where currentStudent.Year = "Senior"
Select currentStudent
' Write a For Each loop to execute the query.
For Each q In q1
Console.WriteLine(q.First & " " & q.Last)
Next
' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students
Where currentStudent.First.StartsWith("C")
Select currentStudent
' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students
Where currentStudent.Rank < 40 And currentStudent.Year = "Senior"
Select currentStudent
' Find all seniors with a lower rank than a student who
' is not a senior.
Dim q4 = From student1 In students, student2 In students
Where student1.Year = "Senior" And student2.Year <> "Senior" And
student1.Rank > student2.Rank
Select student1
Distinct
' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students
Order By currentStudent.Last
Select Name = currentStudent.First & " " & currentStudent.Last
' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students
Where currentStudent.Rank <= 20
Into Count()
' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students
Select currentStudent.Last
Distinct
Into Count()
' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students
Order By currentStudent.Last
Select currentStudent.Last Distinct
For Each nextName As String In q8
lb.Items.Add(nextName)
Next
' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses,
letter In letters
Where proc.ProcessName.Contains(letter)
Select proc
For Each proc In q9
Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next
Zusätzliche Informationen
Nachdem Sie sich nun mit den grundlegenden Konzepten der Arbeit mit Abfragen vertraut gemacht haben, sind Sie nun bereit, die Dokumentation und Beispiele für bestimmte LINQ-Anbieter zu lesen, an denen Sie interessiert sind: