Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic
Diese exemplarische Vorgehensweise veranschaulicht, wie Sie mit Visual Basic-Sprachfunktionen Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)-Abfrageausdrücke erstellen können. 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 enthalten einige neue Funktionen von Visual Basic 2008 wie 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 Videoversion dieses Themas.
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.
Klicken Sie in der Liste Installierte Vorlagen auf Visual Basic.
Klicken Sie in der Liste Projekttypen auf Konsolenanwendung. Geben Sie im Feld Name einen Namen für das Projekt ein, und klicken Sie auf OK.
Ein Projekt wird erstellt. Standardmäßig ist darin ein Verweis auf System.Core.dll enthalten. Außerdem enthält die Liste Importierte Namespaces in Seite "Verweise", Projekt-Designer (Visual Basic) den System.Linq-Namespace.
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.
Wichtig
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. Durch Hinzufügen dieser Klasse können Sie sich einen Überblick über die Objektinitialisierer verschaffen. Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen (Visual Basic).
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 (Visual Basic). 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. 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 (Visual Basic).
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
Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ)
Konzepte
Lokaler Typrückschluss (Visual Basic)
Objektinitialisierer: Benannte und anonyme Typen (Visual Basic)
Einführung in LINQ in Visual Basic
Weitere Ressourcen
LINQ (Language-Integrated Query, sprachintegrierte Abfrage)
Erste Schritte mit LINQ in Visual Basic
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
Mai 2011 |
Abschnitt "Erstellen eines Projekts" überarbeitet. |
Korrektur inhaltlicher Fehler. |