Freigeben über


Grundlegende Abfragevorgänge (Visual Basic)

Dieses Thema enthält eine kurze Einführung in Language-Integrated Abfrageausdrücke (LINQ) in Visual Basic sowie typische Vorgänge, die Sie in einer Abfrage ausführen. Weitere Informationen finden Sie in den folgenden Themen:

Einführung in LINQ in Visual Basic

Fragen

Anleitung: Schreiben von Abfragen in Visual Basic

Angeben der Datenquelle (Von)

In einer LINQ-Abfrage besteht der erste Schritt darin, die Datenquelle anzugeben, die Sie abfragen möchten. Daher kommt die From Klausel in einer Abfrage immer zuerst. Abfrageoperatoren wählen und gestalten das Ergebnis basierend auf dem Typ der Quelle.

Dim query = From cust In customers
'           ...

Die From Klausel gibt die Datenquelle, customersund eine Bereichsvariable an. cust Die Bereichsvariable ist wie eine Schleifeniterationsvariable, mit der Ausnahme, dass in einem Abfrageausdruck keine tatsächliche Iteration auftritt. Wenn die Abfrage ausgeführt wird, oft mit einer For Each Schleife, dient die Bereichsvariable als Verweis auf jedes aufeinanderfolgende Element in customers. Da der Compiler den Typ von cust ableiten kann, müssen Sie ihn nicht explizit angeben. Beispiele für Abfragen, die mit und ohne explizite Eingabe geschrieben wurden, finden Sie unter Typbeziehungen in Abfragevorgängen (Visual Basic).For examples of queries written with and without explicit typeing, see Type Relationships in Query Operations (Visual Basic).

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

Filtern von Daten (wo)

Wahrscheinlich wendet der am häufigsten verwendete Abfragevorgang einen Filter in Form eines booleschen Ausdrucks an. Die Abfrage gibt dann nur die Elemente zurück, für die der Ausdruck wahr ist. Eine Where Klausel wird verwendet, um die Filterung durchzuführen. Der Filter gibt an, welche Elemente in der Datenquelle in die resultierende Sequenz aufgenommen werden sollen. Im folgenden Beispiel werden nur die Kunden einbezogen, die eine Adresse in London haben.

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

Sie können logische Operatoren wie And und Or verwenden, um Filterausdrücke in einer Where-Klausel zu kombinieren. Wenn Sie beispielsweise nur die Kunden aus London zurückgeben möchten und deren Name Devon lautet, verwenden Sie den folgenden Code:

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

Verwenden Sie den folgenden Code, um Kunden aus London oder Paris zurückzugeben:

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

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

Sortieren von Daten (Reihenfolge nach)

Häufig ist es praktisch, zurückgegebene Daten in eine bestimmte Reihenfolge zu sortieren. Die Order By Klausel bewirkt, dass die Elemente in der zurückgegebenen Sequenz nach einem angegebenen Feld oder Feldern sortiert werden. Die folgende Abfrage sortiert beispielsweise die Ergebnisse basierend auf der Name Eigenschaft. Da Name es sich um eine Zeichenfolge handelt, werden die zurückgegebenen Daten alphabetisch sortiert, von A bis Z.

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

Um die Ergebnisse in umgekehrter Reihenfolge zu ordnen, verwenden Sie die Order By...Descending Klausel von Z zu A. Der Standardwert ist Ascending, wenn weder Ascending noch Descending angegeben wird.

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

Auswählen von Daten (Select-Klausel)

Die Select Klausel gibt die Form und den Inhalt der zurückgegebenen Elemente an. Sie können z. B. angeben, ob ihre Ergebnisse aus vollständigen Customer Objekten, nur einer Customer Eigenschaft, einer Teilmenge von Eigenschaften, einer Kombination von 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 der 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 es sich bei einer Customer Instanz um ein großes Objekt mit vielen Feldern handelt, und alle, die Sie abrufen möchten, ist der Name, können Sie auswählen cust.Name, wie im folgenden Beispiel gezeigt. Der lokale Typinschluss erkennt, dass dadurch der Ergebnistyp 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

Wenn Sie mehrere Felder aus der Datenquelle auswählen möchten, haben Sie zwei Möglichkeiten:

  • Geben Sie in der Select Klausel die Felder an, die in das Ergebnis eingeschlossen werden sollen. Der Compiler definiert einen anonymen Typ, der diese Felder als Eigenschaften aufweist. Weitere Informationen finden Sie unter Anonyme Typen.

    Da die zurückgegebenen Elemente im folgenden Beispiel Instanzen eines anonymen Typs sind, können Sie nicht auf den Typ nach Namen an anderer Stelle im Code 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 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 bestimmten Felder enthält, die Sie in das Ergebnis einbeziehen möchten, und erstellen und initialisieren Sie Instanzen des Typs in der Select Klausel. 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 des londonCusts5 folgenden Beispiels ist 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 Clause.

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 implizit Eigenschaften aus beiden im Ergebnis. Die Abfrage wählt Kursteilnehmer 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 Kursteilnehmer ausführen, die in How to: Create a List of Items erstellt wurden.

Das Join Schlüsselwort entspricht einem INNER JOIN in SQL. Sie kombiniert zwei Auflistungen basierend auf dem Abgleich von Schlüsselwerten zwischen 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 Sammlungen in einer einzigen hierarchischen Auflistung, genau wie in LEFT JOIN SQL. Weitere Informationen finden Sie unter Join Clause und Group Join Clause.

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. Beispielsweise gruppiert der folgende Code Schüler nach Klassenjahr.

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 mithilfe der Liste der Kursteilnehmer ausführen, die in How to: Create a List of Items erstellt wurden, lautet die Ausgabe aus der For Each Anweisung:

Jahr: Junior

Tucker, Michael

García, Hugo

García, Debra

Tucker, Lance

Jahr: Senior

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Jahr: Erstsemester

Mortensen, Sven

García, Cesar

Die im folgenden Code gezeigte Variante sortiert die Klassenjahre und sortiert die Kursteilnehmer dann innerhalb jedes Jahres nach 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.

Siehe auch