Grundlegende Abfrageoperationen (Visual Basic)

In diesem Thema finden Sie eine Einführung in LINQ-Ausdrücke (Language Integrated Query) in Visual Basic sowie einige der geläufigsten Vorgänge, die Sie in einer Abfrage durchführen können. Weitere Informationen finden Sie in den folgenden Themen:

Einführung in LINQ in Visual Basic

Abfragen

Exemplarische Vorgehensweise: Schreiben von Abfragen in Visual Basic

Angeben der Datenquelle (From-Klausel)

Der erste Schritt für eine LINQ-Abfrage ist das Festlegen der abzufragenden Datenquelle. Daher steht die From-Klausel in einer Abfrage immer an erster Stelle. Abfrageoperatoren wählen das Ergebnis basierend auf dem Typ der Quelle aus und gestalten es.

Dim query = From cust In customers
'           ...

Die From-Klausel gibt die Datenquelle (customers) und die Bereichsvariable (cust) an. Die Bereichsvariable ähnelt einer Schleifeniterationsvariable, mit dem Unterschied, dass in einem Abfrageausdruck keine Iterationen vorkommen. Wenn die Abfrage ausgeführt wird – häufig in einer For Each-Schleife –, fungiert die Bereichsvariable als Verweis auf jedes aufeinanderfolgende Element in customers. Es ist nicht notwendig, diese explizit anzugeben, da der Compiler den Typ von cust ableitet. Beispiele für Abfragen, die mit und ohne explizite Typisierung geschrieben wurden, finden Sie unter Typbeziehungen in Abfragevorgängen (Visual Basic).

Weitere Informationen zur Verwendung der From-Klausel in Visual Basic finden Sie unter From-Klausel.

Filtern von Daten (Where-Klausel)

Der wahrscheinlich häufigste Abfragevorgang ist das Anwenden eines Filters in Form eines booleschen Ausdrucks. Die Abfrage gibt dann nur jene Elemente zurück, für die der Ausdruck den Wert TRUE hat. Zum Durchführen der Filterung wird eine Where-Klausel verwendet. Der Filter gibt an, welche Elemente in der Datenquelle in die resultierende Sequenz einbezogen werden sollen. Im folgenden Beispiel werden nur die Kund*innen eingeschlossen, die eine Londoner Adresse haben.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

Sie können auch logische Operatoren wie And und Or zum Kombinieren von Filterausdrücken in einer Where-Klausel verwenden. Verwenden Sie beispielsweise den folgenden Code, um nur die Kund*innen zurückzugeben, die aus London stammen und deren Name „Devon“ lautet:

Where cust.City = "London" And cust.Name = "Devon"

Um Kund*innen aus London oder Paris zurückzugeben, verwenden Sie folgenden Code:

Where cust.City = "London" Or cust.City = "Paris"

Weitere Informationen zur Verwendung der Where-Klausel in Visual Basic finden Sie unter Where-Klausel.

Bestelldaten (Order By-Klausel)

Häufig ist es praktisch, zurückgegebene Daten in einer bestimmten Reihenfolge zu sortieren. Die Order By-Klausel bewirkt, dass die Elemente in der zurückgegebenen Sequenz nach einem oder mehreren angegebenen Feldern sortiert werden. Die folgende Abfrage sortiert die Ergebnisse z. B. nach der Name-Eigenschaft. Da Name eine Zeichenfolge ist, werden die zurückgegebenen Daten alphabetisch von A nach Z sortiert.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

Wenn Sie die Ergebnisse andersherum, von Z bis A, sortieren möchten, können Sie die Order By...Descending-Klausel verwenden. Wenn weder Ascending noch Descending angegeben werden, lautet der Standardwert Ascending.

Weitere Informationen zur Verwendung der Order By-Klausel in Visual Basic finden Sie unter Order By-Klausel.

Auswählen von Daten (Select-Klausel)

Die Select-Klausel gibt die Form und den Inhalt der zurückgegebenen Elemente an. Sie können beispielsweise angeben, ob Ihre Ergebnisse aus vollständigen Customer-Objekten, nur einer Customer-Eigenschaft, einer Teilmenge von Eigenschaften, einer Kombination aus Eigenschaften aus verschiedenen Datenquellen oder einem neuen Ergebnistyp basierend auf einer Berechnung bestehen. Wenn die Select-Klausel etwas anderes als eine Kopie des Quellelements erzeugt, wird dieser Vorgang als Projektion bezeichnet.

Um eine Auflistung abzurufen, die aus vollständigen Customer-Objekten besteht, wählen Sie die Bereichsvariable selbst aus:

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Wenn ein Customer-Instanz ein großes Objekt mit vielen Feldern ist und Sie nur den Namen abrufen möchten, können Sie cust.Name auswählen, wie im folgenden Beispiel gezeigt. Der lokale Typrückschluss erkennt, dass der Ergebnistyp dadurch von einer Auflistung von Customer-Objekten in eine Auflistung von Zeichenfolgen geändert wird.

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

Um mehrere Felder aus der Datenquelle auszuwählen, haben Sie zwei Möglichkeiten:

  • Geben Sie in der Select-Klausel die Felder an, die Sie in das Ergebnis einschließen möchten. Der Compiler definiert einen anonymen Typ, der diese Felder als Eigenschaften besitzt. Weitere Informationen finden Sie unter Anonyme Typen.

    Da es sich bei den zurückgegebenen Elementen im folgenden Beispiel um Instanzen eines anonymen Typs handelt, können Sie an anderer Stelle im Code nicht anhand des Namens auf den Typ verweisen. Der vom Compiler festgelegte Name für den Typ enthält Zeichen, die in normalem Visual Basic-Code ungültig sind. Im folgenden Beispiel sind die Elemente in der Auflistung, die von der Abfrage in londonCusts4 zurückgegeben werden, Instanzen eines anonymen Typs.

    Dim londonCusts4 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select Name = cust.Name, Phone = cust.Phone
    
    For Each londonCust In londonCusts4
        Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
    Next
    

    Oder

  • Definieren Sie einen benannten Typ, der die Felder enthält, die Sie in das Ergebnis einschließen möchten, und erstellen und initialisieren Sie anschließend in der Select-Klausel Instanzen des Typs. Verwenden Sie diese Option nur, wenn Sie einzelne Ergebnisse außerhalb der Auflistung verwenden müssen, in der sie zurückgegeben werden, oder wenn Sie sie als Parameter in Methodenaufrufen übergeben müssen. Der Typ von londonCusts5 ist im folgenden Beispiel „IEnumerable(Of NamePhone)“.

    Public Class NamePhone
        Public Name As String
        Public Phone As String
        ' Additional class elements
    End Class
    
    Dim londonCusts5 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select New NamePhone With {.Name = cust.Name,
                                                  .Phone = cust.Phone}
    

Weitere Informationen zur Verwendung der Select-Klausel in Visual Basic finden Sie unter Select-Klausel.

Verknüpfen von Daten (Join- und Group Join-Klausel)

Sie können mehrere Datenquellen in der From-Klausel auf verschiedene Arten kombinieren. Der folgende Code verwendet beispielsweise zwei Datenquellen und kombiniert im Ergebnis implizit Eigenschaften aus beiden. Die Abfrage wählt Schüler*innen aus, deren Nachnamen mit einem Vokal beginnen.

Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
                 Where student.Last.IndexOf(vowel) = 0
                 Select Name = student.First & " " &
                 student.Last, Initial = vowel
                 Order By Initial

For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ":  " & vName.Name)
Next

Hinweis

Sie können diesen Code mit der Liste der Schüler*innen ausführen, die unter Erstellen einer Liste von Elementen erstellt wurde.

Das Schlüsselwort Join ist äquivalent zu INNER JOIN in SQL. Es kombiniert zwei Auflistungen basierend auf übereinstimmenden Schlüsselwerten zwischen den Elementen in den beiden Auflistungen. Die Abfrage gibt alle oder einen Teil der Auflistungselemente zurück, die übereinstimmende Schlüsselwerte aufweisen. Der folgende Code dupliziert beispielsweise die Aktion der vorherigen impliziten Verknüpfung.

Dim vowelNames2 = From student In students
                  Join vowel In vowels
                  On student.Last(0) Equals vowel
                  Select Name = student.First & " " &
                  student.Last, Initial = vowel
                  Order By Initial

Group Join kombiniert Auflistungen (wie LEFT JOIN in SQL) in einer einzigen hierarchischen Auflistung. Weitere Informationen finden Sie unter Join-Klausel und Group Join-Klausel.

Gruppieren von Daten (Group By-Klausel)

Sie können eine Group By-Klausel hinzufügen, um die Elemente in einem Abfrageergebnis nach einem oder mehreren Feldern der Elemente zu gruppieren. Der folgende Code gruppiert z. B. die Schüler*innen nach Klassenstufe.

Dim studentsByYear = From student In students
                     Select student
                     Group By year = student.Year
                     Into Classes = Group

For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next

Wenn Sie diesen Code mit der Liste der Schüler*innen ausführen, die unter Erstellen einer Liste von Elementen erstellt wurde, gibt die For Each-Anweisung Folgendes aus:

Year: Junior

Tucker, Michael

Garcia, Hugo

Garcia, Debra

Tucker, Lance

Year: Senior

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Year: Freshman

Mortensen, Sven

Garcia, Cesar

Die im folgenden Code gezeigte Variante sortiert zunächst die Klassenstufen und anschließend die Schüler*innen der einzelnen Klassenstufen nach dem Nachnamen.

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Weitere Informationen zu Group By finden Sie unter Group By-Klausel.

Weitere Informationen