Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic
Aktualisiert: November 2007
Diese exemplarische Vorgehensweise führt Sie durch die neuen Visual Basic 2008-Sprachfeatures und veranschaulicht, wie diese zum Schreiben von Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)-Abfrageausdrücken verwendet werden. Sie erfahren, wie Sie Abfragen für eine Liste von Studierenden erstellen, wie Sie diese Abfragen ausführen und wie Sie sie ändern. Die Abfragen umfassen verschiedene neue Features von Visual Basic 2008, einschließlich Objektinitialisierer, lokale Typrückschlüsse und anonyme Typen.
Nachdem Sie diese exemplarische Vorgehensweise durchgeführt haben, können Sie mit den Beispielen und der Dokumentation für den spezifischen LINQ-Anbieter fortfahren, der Sie interessiert. Zu den LINQ-Anbietern zählen LINQ to SQL, LINQ to DataSet und LINQ to XML.
Unter Video How to: Writing Queries in Visual Basic finden Sie eine Videodemonstration.
Erstellen eines Projekts
So erstellen Sie ein Projekt, das auf Version 3.5 oder höher von .NET Framework abzielt
Starten Sie Visual Studio 2008.
Klicken Sie im Menü Datei auf Neues Projekt.
Klicken Sie auf Konsolenanwendung und dann auf OK.
Ein Projekt wird erstellt. Standardmäßig enthält es einen Verweis auf System.Core.dll und eine Imports-Anweisung für den System.Linq-Namespace, die beide für die Ausführung von LINQ-Abfragen erforderlich sind.
Hinzufügen einer Datenquelle im Arbeitsspeicher
Die Datenquelle für die Abfragen in dieser exemplarischen Vorgehensweise ist eine Liste von Student-Objekten. Jedes Student-Objekt enthält einen Vornamen, einen Nachnamen, einen Jahrgang und einen akademischen Rang im student-Text.
So fügen Sie die Datenquelle hinzu
Definieren Sie eine Student-Klasse, und erstellen Sie eine Liste der Instanzen der Klasse.
Wichtiger Hinweis: Der Code für die Definition der Student-Klasse und die Erstellung der in der exemplarischen Vorgehensweise verwendeten Liste wird in Gewusst wie: Erstellen einer Liste von Elementen bereitgestellt. Sie können ihn von dort kopieren und in Ihr Projekt einfügen. Der neue Code ersetzt den Code, der beim Erstellen des Projekts angezeigt wird.
So fügen Sie der Liste der Studierenden einen neuen Studenten hinzu
- Befolgen Sie das Muster in der getStudents-Methode, um der Liste eine andere Instanz der Student-Klasse hinzuzufügen. Beim Hinzufügen von Studierenden lernen Sie Objektinitialisierer kennen, die neu in Visual Basic 2008 sind. Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen.
Erstellen einer Abfrage
Bei Ausführung erzeugt die in diesem Abschnitt hinzugefügte Abfrage eine Liste der Studierenden, die aufgrund ihres akademischen Rangs zu den ersten Zehn gehören. Da die Abfrage jedes Mal das komplette Student-Objekt auswählt, lautet der Typ des Abfrageergebnisses IEnumerable(Of Student). Der Typ der Abfrage wird i. d. R. jedoch nicht in Abfragedefinitionen angegeben. Stattdessen verwendet der Compiler einen lokalen Typrückschluss, um den Typ zu bestimmen. Weitere Informationen finden Sie unter Lokaler Typrückschluss. Die Bereichsvariable der currentStudent-Abfrage dient als Verweis auf jede Student-Instanz in der Quelle students und bietet Zugriff auf die Eigenschaften der Objekte in students.
So erstellen Sie eine einfache Abfrage
Suchen Sie die Stelle in der Main-Methode des Projekts, die wie folgt markiert ist:
' ****Paste query and query execution code from the walkthrough, ' ****or any code of your own, here in Main.
Kopieren Sie den folgenden Code, und fügen Sie ihn ein.
Dim studentQuery = From currentStudent In students _ Where currentStudent.Rank <= 10 _ Select currentStudent
Zeigen Sie mit der Maus auf studentQuery im Code, um zu überprüfen, dass der vom Compiler zugewiesene Typ IEnumerable(Of Student) lautet.
Ausführen der Abfrage
Die studentQuery-Variable enthält die Definition der Abfrage, nicht die Ergebnisse aus der Ausführung. Ein typischer Mechanismus für die Ausführung einer Abfrage ist eine For Each-Schleife. Auf jedes Element in der zurückgegebenen Sequenz wird über die Schleifeniterationsvariable 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 unter der Abfrage im Projekt hinzu.
For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Zeigen Sie mit der Maus auf die studentRecord-Schleifensteuerungsvariable, um den Datentyp festzustellen. Der Typ von studentRecord wird als Student abgeleitet, da studentQuery eine Auflistung von Student-Instanzen zurückgibt.
Erstellen Sie die Anwendung, und führen Sie sie aus, indem Sie STRG+F5 drücken. Beachten Sie die Ergebnisse im Konsolenfenster.
Ändern der Abfrage
Es ist leichter, Abfrageergebnisse zu prüfen, wenn sie sich einer bestimmten Reihenfolge befinden. Sie können die zurückgegebene Sequenz auf Grundlage eines verfügbaren Felds sortieren.
So sortieren Sie die Ergebnisse
Fügen Sie die folgende Order By-Klausel zwischen der Where-Anweisung und der Select-Anweisung der Abfrage hinzu. Die Order By-Klausel sortiert die Ergebnisse anhand der Nachnamen der Studenten alphabetisch von A bis Z.
Order By currentStudent.Last Ascending _
Um zuerst nach Nachname und anschließend nach Vorname zu sortieren, müssen Sie der Abfrage beide Felder hinzufügen:
Order By currentStudent.Last Ascending, currentStudent.First Ascending _
Sie können auch Descending angeben, um von Z bis A zu sortieren.
Erstellen Sie die Anwendung, und führen Sie sie aus, indem Sie STRG+F5 drücken. Beachten Sie die Ergebnisse im Konsolenfenster.
So führen Sie einen lokalen Bezeichner ein
Fügen Sie den Code in diesem Abschnitt hinzu, um einen lokalen Bezeichner in den Abfrageausdruck einzuführen. Der lokale Bezeichner enthält ein Zwischenergebnis. Im folgenden Beispiel ist name ein Bezeichner, der eine Verkettung aus Vor- und Nachname des Studierenden enthält. Ein lokaler Bezeichner kann aus praktischen Gründen verwendet werden oder die Leistung durch Speichern der Ergebnisse eines Ausdrucks verbessern, die ansonsten mehrmals berechnet werden müssten.
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
Erstellen Sie die Anwendung, und führen Sie sie aus, indem Sie STRG+F5 drücken. 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 erzeugt, die andere Elemente als die in der Quelle enthält. Im folgenden Beispiel ist die Quelle eine Auflistung von Student-Objekten, aber nur ein Member jedes Objekts wird zurückgegeben: der Vorname von Studenten mit dem Nachnamen Garcia. Da currentStudent.First eine Zeichenfolge ist, lautet der Datentyp der von studentQuery3 zurückgegebenen Sequenz IEnumerable(Of String) (eine Zeichenfolgesequenz). Wie in früheren Beispielen wird die Zuordnung eines Datentyps für studentQuery3 dem Compiler in Form eines lokalen Typrückschlusses überlassen.
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 der Maus auf studentQuery3 im Code, um zu überprüfen, dass der zugewiesene Typ IEnumerable(Of String) lautet.
Erstellen Sie die Anwendung, und führen Sie sie aus, indem Sie STRG+F5 drücken. 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 erfahren, wie anonyme Typen in Abfragen verwendet werden. Anonyme Typen sind ein neues Feature in Visual Basic 2008. Sie verwenden sie in Abfragen, wenn Sie mehrere Felder statt kompletter Datensätze (currentStudent-Datensätze in den vorigen Beispielen) aus der Datenquelle oder einzelne Felder (First im vorangegangenen Abschnitt) zurückgeben möchten. Anstatt einen neuen benannten Typ zu definieren, der die Felder enthält, die im Ergebnis einbezogen werden sollen, geben Sie die Felder in der Select-Klausel an, und der Compiler erstellt 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 Studierenden höherer Semester mit einem akademischen Rang zwischen 1 und 10 nach Rang geordnet zurückgibt. In diesem Beispiel muss der studentQuery4-Typ abgeleitet werden, da die Select-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
Erstellen Sie die Anwendung, und führen Sie sie aus, indem Sie STRG+F5 drücken. Beachten Sie die Ergebnisse im Konsolenfenster.
Weitere Beispiele
Nachdem Sie nun die Grundlagen kennen gelernt haben, finden Sie im Folgenden eine Liste zusätzlicher Beispiele, die die Flexibilität und Leistungsstärke von LINQ-Abfragen veranschaulichen. Jedem Beispiel ist eine kurze Beschreibung vorangestellt. Zeigen Sie mit der Maus auf die Abfrageergebnisvariable für jede Abfrage, um den per Rückschluss abgeleiteten Typ zu sehen. Verwenden Sie eine For Each-Schleife, um die Ergebnisse zu erzeugen.
' 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 nun mit den grundlegenden Konzepten der Arbeit mit Abfragen vertraut sind, können Sie die Dokumentation und die Beispiele des spezifischen LINQ-Anbieters lesen, der Sie interessiert:
Siehe auch
Aufgaben
Beispielabfragen (Visual Basic)
Konzepte
Objektinitialisierer: Benannte und anonyme Typen
Einführung in LINQ in Visual Basic
Weitere Ressourcen
Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)