Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Starten Sie Visual Studio.
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Klicken Sie in der Liste "Installierte Vorlagen" auf Visual Basic.
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.
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 derStudent
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
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
Positionieren Sie den Mauszeiger über
studentQuery
in Ihrem Code, um zu überprüfen, ob der vom Compiler zugewiesene TypIEnumerable(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
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
Halten Sie den Mauszeiger auf der Schleifensteuerungsvariablen
studentRecord
, um den Datentyp anzuzeigen. Der Typ vonstudentRecord
wird alsStudent
abgeleitet, weilstudentQuery
eine Auflistung vonStudent
-Instanzen zurückgibt.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
Fügen Sie die folgende
Order By
Klausel zwischen derWhere
Anweisung und derSelect
Anweisung der Abfrage hinzu. DieOrder By
Klausel sortiert die Ergebnisse alphabetisch von A bis Z gemäß dem Nachnamen jedes Schülers.Order By currentStudent.Last Ascending
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.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
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
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
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 vonStudent
Objekten, aber nur ein Element jedes Objekts wird zurückgegeben: der Vorname der Schüler, deren Nachname Garca ist. Da es sich beicurrentStudent.First
um eine Zeichenfolge handelt, ist der vonstudentQuery3
zurückgegebene DatentypIEnumerable(Of String)
, eine Sequenz von Zeichenfolgen. Wie in früheren Beispielen wird die Zuordnung eines Datentyps fürstudentQuery3
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
Positionieren Sie den Mauszeiger über
studentQuery3
in Ihrem Code, um zu überprüfen, ob der zugewiesene TypIEnumerable(Of String)
ist.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
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 derSelect
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 dieSelect
-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
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: