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
StudentKlasse, und erstellen Sie eine Liste der Instanzen der Klasse.Von Bedeutung
Der Code, der zum Definieren der
StudentKlasse 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
getStudentsMethode, um der Liste eine weitere Instanz derStudentKlasse 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
MainMethode 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 currentStudentPositionieren Sie den Mauszeiger über
studentQueryin 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 EachSchleife unterhalb der Abfrage in Ihrem Projekt hinzu.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextHalten Sie den Mauszeiger auf der Schleifensteuerungsvariablen
studentRecord, um den Datentyp anzuzeigen. Der Typ vonstudentRecordwird alsStudentabgeleitet, weilstudentQueryeine 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 ByKlausel zwischen derWhereAnweisung und derSelectAnweisung der Abfrage hinzu. DieOrder ByKlausel sortiert die Ergebnisse alphabetisch von A bis Z gemäß dem Nachnamen jedes Schülers.Order By currentStudent.Last AscendingFügen Sie der Abfrage beide Felder hinzu, um nach Nachname und Vorname zu sortieren:
Order By currentStudent.Last Ascending, currentStudent.First AscendingSie 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
nameein 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) NextErstellen 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 EachSchleife 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 vonStudentObjekten, aber nur ein Element jedes Objekts wird zurückgegeben: der Vorname der Schüler, deren Nachname Garca ist. Da es sich beicurrentStudent.Firstum eine Zeichenfolge handelt, ist der vonstudentQuery3zurückgegebene DatentypIEnumerable(Of String), eine Sequenz von Zeichenfolgen. Wie in früheren Beispielen wird die Zuordnung eines Datentyps fürstudentQuery3dem 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) NextPositionieren Sie den Mauszeiger über
studentQuery3in 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 (
currentStudentDatensätze in früheren Beispielen) oder einzelne Felder (Firstim 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 derSelectKlausel 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
studentQuery4abgeleitet 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) NextErstellen 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: