Freigeben über


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

  1. Starten Sie Visual Studio.

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

  3. Wählen Sie in der Liste Installierte Vorlagen die Option Visual Basic aus.

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

  5. 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 der Student-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

  1. 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
    
  2. Zeigen Sie mit dem Mauszeiger im Code auf studentQuery, um zu überprüfen, ob der vom Compiler zugewiesene Typ IEnumerable(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

  1. 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
    
  2. Zeigen Sie mit dem Mauszeiger auf die Schleifensteuervariable studentRecord, um deren Datentyp anzuzeigen. Als Typ von studentRecord wird Student abgeleitet, da studentQuery eine Auflistung von Student-Instanzen zurückgibt.

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

  1. Fügen Sie die folgende Order By-Klausel zwischen der Where-Anweisung und der Select-Anweisung der Abfrage hinzu. Die Order By-Klausel ordnet die Ergebnisse in alphabetischer Reihenfolge (A bis Z) nach dem Nachnamen der Schulkinder.

    Order By currentStudent.Last Ascending
    
  2. 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.

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

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

  1. 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 von Student-Objekten, wobei aber nur ein Element jedes Objekts zurückgegeben wird: der Vorname von Schulkindern, deren Nachname Garcia lautet. Da currentStudent.First eine Zeichenfolge ist, hat die von studentQuery3 zurückgegebene Sequenz den Datentyp IEnumerable(Of String) – eine Sequenz von Zeichenfolgen. Wie in früheren Beispielen bleibt die Zuweisung eines Datentyps für studentQuery3 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
    
  2. Zeigen Sie mit dem Mauszeiger im Code auf studentQuery3, um zu überprüfen, ob der zugewiesene Typ IEnumerable(Of String) ist.

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

  1. 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 der Select-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 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. 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:

Siehe auch