Freigeben über


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.

Link zu Video Unter Video How to: Writing Queries in Visual Basic finden Sie eine Videoversion dieses Themas.

Erstellen eines Projekts

So erstellen Sie ein Konsolenanwendungsprojekt

  1. Starten Sie Visual Studio.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  3. Klicken Sie in der Liste Installierte Vorlagen auf Visual Basic.

  4. 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

  1. 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
    
  2. 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

  1. 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
    
  2. 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.

  3. 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

  1. 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 
    
  2. 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.

  3. 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

  1. 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
    
  2. 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

  1. 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
    
  2. Zeigen Sie mit der Maus auf studentQuery3 im Code, um zu überprüfen, dass der zugewiesene Typ IEnumerable(Of String) lautet.

  3. 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

  1. 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
    
  2. 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:

LINQ-zu-Objekte

LINQ to SQL

LINQ to XML

LINQ to DataSet

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ)

Konzepte

Zusätzliche LINQ-Ressourcen

Lokaler Typrückschluss (Visual Basic)

Objektinitialisierer: Benannte und anonyme Typen (Visual Basic)

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

LINQ in Visual Basic

Abfragen (Visual Basic)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Mai 2011

Abschnitt "Erstellen eines Projekts" überarbeitet.

Korrektur inhaltlicher Fehler.