Freigeben über


Anleitung: 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 veranschaulicht, wie Abfragen in einer Liste von Student-Objekten erstellt werden, wie die Abfragen ausgeführt werden und wie sie geändert werden. Die Abfragen enthalten mehrere Eigenschaften, einschließlich Objektinitialisierer, lokaler Typinferenz und anonymer Typen.

Nach Abschluss dieser exemplarischen Vorgehensweise können Sie mit den Beispielen und Dokumentationen für den jeweiligen LINQ-Anbieter fortfahren, an dem Sie interessiert sind. LINQ-Anbieter umfassen 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. Klicken Sie in der Liste "Installierte Vorlagen" auf Visual Basic.

  4. Klicken Sie in der Liste der Projekttypen auf "Konsolenanwendung". Geben Sie im Feld "Name " einen Namen für das Projekt ein, und klicken Sie dann auf "OK".

    Ein Projekt wird erstellt. Standardmäßig enthält sie einen Verweis auf System.Core.dll. Außerdem enthält die Liste importierter Namespaces auf der Seite "Verweise", Project Designer (Visual Basic) den System.Linq Namespace.

  5. Stellen Sie auf der Kompilierungsseite von Project Designer (Visual Basic) sicher, dass "Option infer " auf "Ein" festgelegt ist.

Hinzufügen einer In-Memory Datenquelle

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, ein Kursjahr und einen akademischen Rang im Kurskörper.

So fügen Sie die Datenquelle hinzu

  • Definieren Sie eine Student Klasse, und erstellen Sie eine Liste der Instanzen der Klasse.

    Von Bedeutung

    Der Code, der zum Definieren der Student Klasse und zum Erstellen der liste in den exemplarischen Beispielen verwendet wird, finden Sie unter "How to: Create a List of Items". Sie können es von dort kopieren und in Ihr Projekt einfügen. Der neue Code ersetzt den Code, der beim Erstellen des Projekts angezeigt wurde.

So fügen Sie der Kursteilnehmerliste einen neuen Kursteilnehmer hinzu

  • Folgen Sie dem 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 Object Initializers: Named and Anonymous Types.

Erstellen einer Abfrage

Wenn die in diesem Abschnitt hinzugefügte Abfrage ausgeführt wird, erzeugt sie eine Liste der Studenten, deren akademischer Rang sie unter die Top zehn versetzt. Da die Abfrage jedes Mal das vollständige Student Objekt auswählt, lautet IEnumerable(Of Student)der Typ des Abfrageergebnisses . Der Abfragetyp wird jedoch in der Regel nicht in Abfragedefinitionen angegeben. Stattdessen verwendet der Compiler lokale Typinferenz, um den Typ zu bestimmen. Weitere Informationen finden Sie unter „Lokale Typinferenz“. Die Bereichsvariable currentStudent der Abfrage dient als Verweis auf jede Student-Instanz in der Quelle students und ermöglicht den Zugriff auf die Eigenschaften jedes Objekts in students.

So erstellen Sie eine einfache Abfrage

  1. Suchen Sie den Ort in der Main Methode des Projekts, das 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. Positionieren Sie den Mauszeiger über studentQuery in Ihrem Code, um zu überprüfen, ob der vom Compiler zugewiesene Typ IEnumerable(Of Student) ist.

Abfrage ausführen

Die Variable studentQuery enthält die Definition der Abfrage, nicht die Ergebnisse der Ausführung der Abfrage. Ein typischer Mechanismus zum Ausführen einer Abfrage ist eine For Each Schleife. Auf jedes Element in der zurückgegebenen Sequenz wird über die Iterationsvariable der Schleife zugegriffen. Weitere Informationen zur Abfrageausführung finden Sie unter Writing Your First LINQ Query.

So führen Sie die Abfrage aus

  1. Fügen Sie die folgende For Each Schleife unterhalb der Abfrage in Ihrem Projekt hinzu.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Halten Sie den Mauszeiger auf der Schleifensteuerungsvariablen studentRecord , um den Datentyp anzuzeigen. Der Typ von studentRecord wird als Student abgeleitet, weil 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 einfacher, Abfrageergebnisse zu scannen, wenn sie in einer angegebenen Reihenfolge vorhanden sind. Sie können die zurückgegebene Sequenz basierend auf jedem verfügbaren Feld sortieren.

So ordnen Sie die Ergebnisse an

  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 alphabetisch von A bis Z gemäß dem Nachnamen jedes Schülers.

    Order By currentStudent.Last Ascending
    
  2. Fügen Sie der Abfrage beide Felder hinzu, um nach Nachname und Vorname zu sortieren:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Sie können auch angeben Descending , dass die Reihenfolge von Z zu A erfolgen soll.

  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 im Abfrageausdruck einzuführen. Der lokale Bezeichner speichert ein Zwischenergebnis. Im folgenden Beispiel ist name ein Bezeichner, der eine Verkettung des Vor- und Nachnamens des Schülers enthält. Ein lokaler Bezeichner kann zur Vereinfachung verwendet werden, oder es kann die Leistung verbessern, indem die Ergebnisse eines Ausdrucks gespeichert werden, der andernfalls mehrmals berechnet wird.

    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 For Each Schleife aus diesem Abschnitt hinzu, um eine Abfrage zu erstellen, die eine Sequenz erzeugt, deren Elemente sich von den Elementen in der Quelle unterscheiden. Im folgenden Beispiel ist die Quelle eine Auflistung von Student Objekten, aber nur ein Element jedes Objekts wird zurückgegeben: der Vorname der Schüler, deren Nachname Garca ist. Da es sich bei currentStudent.First um eine Zeichenfolge handelt, ist der von studentQuery3 zurückgegebene Datentyp IEnumerable(Of String), eine Sequenz von Zeichenfolgen. Wie in früheren Beispielen wird die Zuordnung eines Datentyps für studentQuery3 dem Compiler überlassen, der dies mithilfe der lokalen Typinferenz 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. Positionieren Sie den Mauszeiger über studentQuery3 in Ihrem Code, um zu überprüfen, ob der zugewiesene Typ IEnumerable(Of String) ist.

  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 sehen, wie anonyme Typen in Abfragen verwendet werden. Sie verwenden sie in Abfragen, wenn Sie mehrere Felder aus der Datenquelle zurückgeben möchten, anstatt datensätze (currentStudent Datensätze in früheren Beispielen) oder einzelne Felder (First im vorherigen Abschnitt). Anstatt einen neuen benannten Typ zu definieren, der die Felder enthält, die Sie in das Ergebnis einbeziehen möchten, 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 rang der Senioren zurückgibt, deren akademischer Rang zwischen 1 und 10 liegt, in Der Reihenfolge des akademischen Rangs. In diesem Beispiel muss der Typ von studentQuery4 abgeleitet werden, weil die Select-Klausel eine Instanz eines anonymen Typs zurückgibt, und ein anonymer Typ hat keinen verwendbaren Namen.

    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 die Grundlagen verstanden haben, finden Sie im Folgenden eine Liste zusätzlicher Beispiele zur Veranschaulichung der Flexibilität und Leistungsfähigkeit von LINQ-Abfragen. Jedem Beispiel ist eine kurze Beschreibung vorangestellt, die erklärt, was es macht. Zeigen Sie mit dem Mauszeiger auf die Abfrageergebnisvariable für jede Abfrage, 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

Zusatzinformation

Nachdem Sie mit den grundlegenden Konzepten für die Arbeit mit Abfragen vertraut sind, können Sie die Dokumentation und Beispiele für den spezifischen LinQ-Anbieter lesen, an dem Sie interessiert sind:

Siehe auch