Einführung in LINQ in Visual Basic

Language-Integrated Query (LINQ) fügt Visual Basic Abfragefunktionen hinzu und stellt einfache und leistungsstarke Funktionen zum Arbeiten mit allen Arten von Daten bereit. Statt eine Abfrage zum Verarbeiten an eine Datenbank zu senden oder für jede Art von zu suchenden Daten mit unterschiedlichen Abfragesyntaxarten zu arbeiten, werden von LINQ Abfragen als Teil der Visual Basic-Sprache eingeführt. LINQ verwendet eine einheitliche Syntax, die unabhängig von der Art der Daten ist.

Mit LINQ können Sie Daten aus SQL Server-Datenbank, XML, speicherinternen Arrays und Auflistungen, ADO.NET-DataSets oder beliebigen anderen Remotedatenquellen bzw. lokalen Datenquellen abfragen, die LINQ unterstützen. Hierzu können Sie allgemeine Visual Basic-Sprachelemente verwenden. Da Sie Ihre Abfragen in der Visual Basic-Sprache schreiben, werden die Abfrageergebnisse als stark typisierte Objekte zurückgegeben. Da diese Objekte IntelliSense unterstützen, können Sie Code schneller schreiben und Fehler in den Abfragen statt zur Laufzeit zur Kompilierungszeit abfangen. Sie können LINQ-Abfragen als Quelle für weitere Abfragen verwenden, um die Ergebnisse zu verfeinern. Außerdem können sie an Steuerelemente gebunden werden, sodass Benutzer die Ergebnisse Ihrer Abfragen einfach anzeigen und ändern können.

Das folgende Codebeispiel enthält beispielsweise eine LINQ-Abfrage, die eine Liste von Kunden aus einer Auflistung zurückgibt und diese abhängig von ihrem Standort gruppiert.

' Obtain a list of customers.
Dim customers As List(Of Customer) = GetCustomers()

' Return customers that are grouped based on country.
Dim countries = From cust In customers
                Order By cust.Country, cust.City
                Group By CountryName = cust.Country
                Into CustomersInCountry = Group, Count()
                Order By CountryName

' Output the results.
For Each country In countries
    Debug.WriteLine(country.CountryName & " count=" & country.Count)

    For Each customer In country.CustomersInCountry
        Debug.WriteLine("   " & customer.CompanyName & "  " & customer.City)
    Next
Next

' Output:
'   Canada count=2
'      Contoso, Ltd  Halifax
'      Fabrikam, Inc.  Vancouver
'   United States count=1
'      Margie's Travel  Redmond

Ausführen der Beispiele

Um die Beispiele in der Einführung und im Abschnitt Struktur einer LINQ-Abfrage auszuführen, fügen Sie den folgenden Code ein, mit dem Listen von Kund*innen und Bestellungen zurückgegeben werden.

' Return a list of customers.
Private Function GetCustomers() As List(Of Customer)
    Return New List(Of Customer) From
        {
            New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
            New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
            New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
        }
End Function

' Return a list of orders.
Private Function GetOrders() As List(Of Order)
    Return New List(Of Order) From
        {
            New Order With {.CustomerID = 1, .Amount = "200.00"},
            New Order With {.CustomerID = 3, .Amount = "600.00"},
            New Order With {.CustomerID = 1, .Amount = "300.00"},
            New Order With {.CustomerID = 2, .Amount = "100.00"},
            New Order With {.CustomerID = 3, .Amount = "800.00"}
        }
End Function

' Customer Class.
Private Class Customer
    Public Property CustomerID As Integer
    Public Property CompanyName As String
    Public Property City As String
    Public Property Country As String
End Class

' Order Class.
Private Class Order
    Public Property CustomerID As Integer
    Public Property Amount As Decimal
End Class

LINQ-Anbieter

Ein LINQ-Anbieter ordnet die LINQ-Abfragen in Visual Basic der Datenquelle zu, die abgefragt wird. Wenn Sie eine LINQ-Abfrage schreiben, wird diese Abfrage vom Anbieter entgegengenommen und in Befehle übersetzt, die von der Datenquelle ausgeführt werden können. Weiterhin werden die Daten aus der Quelle vom Anbieter in die Objekte umgewandelt, die das Abfrageergebnis darstellen. Außerdem werden Objekte in Daten umgewandelt, wenn Sie Aktualisierungen an die Datenquelle senden.

Visual Basic enthält die folgenden LINQ-Anbieter:

Anbieter Beschreibung
LINQ to Objects Mit dem Anbieter LINQ to Objects können Sie speicherinterne Auflistungen und Arrays abfragen. Wenn ein Objekt die IEnumerable-Schnittstelle oder die IEnumerable<T>-Schnittstelle unterstützt, können Sie es mit dem Anbieter LINQ to Objects abfragen.

Sie können den Anbieter „LINQ to Objects“ aktivieren, indem Sie den System.Linq-Namespace importieren, der standardmäßig in allen Visual Basic-Projekten importiert wird.

Weitere Informationen zum Anbieter „LINQ to Objects“ finden Sie unter LINQ to Objects.
LINQ to SQL Mit dem Anbieter LINQ to SQL können Sie Daten einer SQL Server-Datenbank abfragen und ändern. Dies erleichtert das Zuordnen des Objektmodells einer Anwendung zu den Tabellen und Objekten in einer Datenbank.

Visual Basic erleichtert die Arbeit mit LINQ to SQL durch den O/R-Designer (Object Relational Designer, objektrelationaler Designer). Der Designer wird verwendet, um in einer Anwendung ein Objektmodell zu erstellen, das den Objekten in einer Datenbank entspricht. Außerdem werden mit dem O/R-Designer Funktionen zum Zuordnen gespeicherter Prozeduren und Funktionen zum DataContext-Objekt bereitgestellt, das die Kommunikation mit der Datenbank verwaltet und den Zustand für Überprüfungen auf optimistische Nebenläufigkeit speichert.

Weitere Informationen zum Anbieter „LINQ to SQL“ finden Sie unter LINQ to SQL. Weitere Informationen zum O/R-Designer finden Sie unter LINQ to SQL-Tools in Visual Studio.
LINQ to XML Mit dem Anbieter LINQ to XML können Sie XML abfragen und ändern. Sie können speicherinternes XML ändern, oder Sie können XML aus einer Datei laden und in einer Datei speichern.

Darüber hinaus ermöglicht der Anbieter „LINQ to XML“ XML-Literale und XML-Achseneigenschaften, mit denen Sie XML direkt im Visual Basic-Code schreiben können. Weitere Informationen finden Sie unter XML in Visual Basic.
LINQ to DataSet Mit dem Anbieter „LINQ to DataSet“ können Sie Daten in einem ADO.NET-DataSet abfragen und aktualisieren. Sie können Anwendungen, die DataSets verwenden, die Leistungsfähigkeit von LINQ hinzufügen und so die Funktionen zum Abfragen, Aggregieren und Aktualisieren der Daten in Ihrem DataSet vereinfachen und erweitern.

Weitere Informationen finden Sie unter LINQ to DataSet.

Struktur einer LINQ-Abfrage

Eine LINQ-Abfrage, häufig auch als Abfrageausdruck bezeichnet, besteht aus einer Kombination von Abfrageklauseln, die die Datenquellen und Iterationsvariablen für die Abfrage identifizieren. Ein Abfrageausdruck kann auch Anweisungen zum Sortieren, Filtern, Gruppieren und Verknüpfen sowie auf die Quelldaten anzuwendende Berechnungen enthalten. Die Abfrageausdruckssyntax ähnelt der Syntax von SQL. Deshalb werden Ihnen möglicherweise große Teile der Syntax vertraut vorkommen.

Ein Abfrageausdruck beginnt mit einer From-Klausel. Diese Klausel gibt die Quelldaten für eine Abfrage und die Variablen an, die verwendet werden, um sich auf die einzelnen Elemente der Quelldaten zu beziehen. Diese Variablen werden als Bereichsvariablen oder Iterationsvariablen bezeichnet. In Abfragen ist die From-Klausel erforderlich (mit Ausnahme von Aggregate-Abfragen, in denen die From-Klausel optional ist). Nachdem Sie den Bereich und die Quelle der Abfrage in der From-Klausel oder der Aggregate-Klausel angegeben haben, können Sie weitere Abfrageklauseln beliebig kombinieren, um die Abfrage zu verfeinern. Ausführliche Informationen zu Abfrageklauseln finden Sie weiter unten in diesem Thema unter „Visual Basic LINQ-Abfrageoperatoren“. In der folgenden Abfrage wird beispielsweise die Variable customers als eine Quellauflistung von Kundendaten identifiziert, außerdem eine Iterationsvariable mit dem Namen cust.

Dim customers = GetCustomers()

Dim queryResults = From cust In customers

For Each result In queryResults
    Debug.WriteLine(result.CompanyName & "  " & result.Country)
Next

' Output:
'   Contoso, Ltd  Canada
'   Margie's Travel  United States
'   Fabrikam, Inc.  Canada

Dieses Beispiel ist bereits eine gültige Abfrage, sie wird jedoch weitaus leistungsstärker, wenn Sie weitere Abfrageklauseln hinzufügen, um die Abfrage zu verfeinern. Beispielsweise können Sie eine Where-Klausel hinzufügen, um das Ergebnis nach einem oder mehreren Werten zu filtern. Abfrageausdrücke bestehen aus einer einzelnen Codezeile, an das Ende der Abfrage können Sie einfach zusätzliche Abfrageklauseln anfügen. Um die Lesbarkeit zu verbessern, können Sie eine Abfrage mit dem Zeilenfortsetzungszeichen Unterstrich (_) auf mehrere Textzeilen aufteilen. Das folgende Codebeispiel enthält eine Abfrage mit einer Where-Klausel.

Dim queryResults = From cust In customers
                   Where cust.Country = "Canada"

Die Select-Klausel ist eine weitere leistungsstarke Abfrageklausel, mit deren Hilfe Sie lediglich ausgewählte Felder der Datenquelle zurückgeben können. LINQ-Abfragen geben aufzählbare Auflistungen von stark typisierten Objekten zurück. Eine Abfrage kann eine Auflistung von anonymen oder benannten Typen zurückgeben. Sie können die Select-Klausel verwenden, um lediglich ein einzelnes Feld aus der Datenquelle zurückzugeben. In diesem Fall entspricht der Typ der zurückgegebenen Auflistung dem Typ dieses Felds. Sie können die Select-Klausel auch verwenden, um mehrere Felder aus der Datenquelle zurückzugeben. In diesem Fall ist der Typ der zurückgegebenen Auflistung ein neuer anonymer Typ. Sie können die von der Abfrage zurückgegebenen Felder auch den Feldern eines angegebenen benannten Typen zuordnen. Das folgende Codebeispiel enthält einen Abfrageausdruck, der eine Auflistung von anonymen Typen zurückgibt, deren Member mit den Daten aus den ausgewählten Feldern der Datenquelle gefüllt werden.

Dim queryResults = From cust In customers
               Where cust.Country = "Canada"
               Select cust.CompanyName, cust.Country

Sie können LINQ-Abfragen auch verwenden, um ein einzelnes, aus mehreren Datenquellen kombiniertes Ergebnis zurückzugeben. Sie können dies mithilfe einer oder mehrerer From-Klauseln erreichen, oder Sie verwenden die Join-Abfrageklausel bzw. die Group Join-Abfrageklausel. Das folgende Codebeispiel enthält einen Abfrageausdruck, der Kunden- und Bestelldaten kombiniert und eine Auflistung von anonymen Typen mit Kunden- und Bestelldaten zurückgibt.

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers, ord In orders
           Where cust.CustomerID = ord.CustomerID
           Select cust, ord

For Each result In queryResults
    Debug.WriteLine(result.ord.Amount & "  " & result.ord.CustomerID & "  " & result.cust.CompanyName)
Next

' Output:
'   200.00  1  Contoso, Ltd
'   300.00  1  Contoso, Ltd
'   100.00  2  Margie's Travel
'   600.00  3  Fabrikam, Inc.
'   800.00  3  Fabrikam, Inc.

Mit der Group Join-Klausel können Sie ein hierarchisches Abfrageergebnis erstellen, das eine Auflistung von Kundenobjekten enthält. Jedes Kundenobjekt verfügt über eine Eigenschaft, die eine Auflistung aller Bestellungen des Kunden enthält. Das folgende Codebeispiel enthält einen Abfrageausdruck, der Kunden- und Bestelldaten in einem hierarchischen Ergebnis kombiniert und eine Auflistung von anonymen Typen zurückgibt. Die Abfrage gibt einen Typ zurück, der über eine CustomerOrders-Eigenschaft verfügt, die eine Auflistung mit den Bestelldaten des Kunden enthält. Außerdem verfügt er über eine OrderTotal-Eigenschaft, die die Summe der Gesamtsummen aller Bestellungen dieses Kunden enthält. (Diese Abfrage entspricht einem LEFT OUTER JOIN.)

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                     Into CustomerOrders = Group,
                          OrderTotal = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, OrderTotal

For Each result In queryResults
    Debug.WriteLine(result.OrderTotal & "  " & result.CustomerID & "  " & result.CompanyName)
    For Each ordResult In result.CustomerOrders
        Debug.WriteLine("   " & ordResult.Amount)
    Next
Next

' Output:
'   500.00  1  Contoso, Ltd
'      200.00
'      300.00
'   100.00  2  Margie's Travel
'      100.00
'   1400.00  3  Fabrikam, Inc.
'      600.00
'      800.00

Es gibt verschiedene weitere LINQ-Abfrageoperatoren, die Sie verwenden können, um leistungsstarke Abfrageausdrücke zu erstellen. Im nächsten Abschnitt dieses Themas werden die verschiedenen Abfrageklauseln erläutert, die Sie in einem Abfrageausdruck angeben können. Ausführliche Informationen zu Visual Basic-Abfrageklauseln finden Sie unter Abfragen (Visual Basic).

Visual Basic LINQ-Abfrageoperatoren

Die Klassen im System.Linq-Namespace und in den anderen Namespaces, die LINQ-Abfragen unterstützen, schließen Methoden ein, die Sie aufrufen können, um Abfragen auf Grundlage der Anforderungen Ihrer Anwendung zu erstellen und zu optimieren. Visual Basic enthält Schlüsselwörter für die folgenden allgemeinen Abfrageklauseln. Ausführliche Informationen zu Visual Basic-Abfrageklauseln finden Sie unter Abfragen (Visual Basic).

From-Klausel

Am Anfang einer Abfrage muss eine From-Klausel oder eine Aggregate-Klausel stehen. Mit einer From-Klausel geben Sie für eine Abfrage eine Quellauflistung und eine Iterationsvariable an. Beispiel:

' Returns the company name for all customers for which
' the Country is equal to "Canada".
Dim names = From cust In customers
            Where cust.Country = "Canada"
            Select cust.CompanyName

Select-Klausel

Optional. Eine Select-Klausel deklariert einen Satz von Iterationsvariablen für eine Abfrage. Beispiel:

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers
                   Select cust.CompanyName, cust.CustomerID

Wenn keine Select-Klausel angegeben wird, bestehen die Iterationsvariablen für die Abfrage aus den in der From-Klausel oder der Aggregate-Klausel angegebenen Iterationsvariablen.

WHERE-Klausel

Optional. Eine Where-Klausel gibt eine Filterbedingung für eine Abfrage an. Beispiel:

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products
            Where product.Category = "Beverages"
            Select product.Name

Order By-Klausel

Optional. Eine Order By-Klausel gibt die Sortierreihenfolge für Spalten in einer Abfrage an. Beispiel:

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In books
                           Order By b.price

Join-Klausel

Optional. Eine Join-Klausel fasst zwei Auflistungen zu einer einzelnen Auflistung zusammen. Beispiel:

' Returns a combined collection of all of the 
' processes currently running and a descriptive
' name for the process taken from a list of 
' descriptive names.
Dim processes = From proc In Process.GetProcesses
                Join desc In processDescriptions
                  On proc.ProcessName Equals desc.ProcessName
                Select proc.ProcessName, proc.Id, desc.Description

Group By-Klausel

Optional. Eine Group By-Klausel gruppiert die Elemente eines Abfrageergebnisses. Sie kann verwendet werden, um Aggregatfunktionen auf die einzelnen Gruppen anzuwenden. Beispiel:

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orderList = From order In orders
                Order By order.OrderDate
                Group By OrderDate = order.OrderDate
                Into OrdersByDate = Group

Group Join-Klausel

Optional. Eine Group Join-Klausel fasst zwei Auflistungen zu einer einzelnen hierarchischen Auflistung zusammen. Beispiel:

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                   Into CustomerOrders = Group,
                        TotalOfOrders = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, TotalOfOrders

Aggregate-Klausel

Am Anfang einer Abfrage muss eine Aggregate-Klausel oder eine From-Klausel stehen. Mit einer Aggregate-Klausel wenden Sie eine oder mehrere Aggregatfunktionen auf eine Auflistung an. Beispielsweise können Sie mit der Aggregate-Klausel die Summe der von einer Abfrage zurückgegebenen Elemente berechnen, wie im folgenden Beispiel gezeigt:

' Returns the sum of all order amounts.
Dim orderTotal = Aggregate order In orders
                 Into Sum(order.Amount)

Außerdem können Sie die Aggregate-Klausel verwenden, um eine Abfrage zu ändern. Beispielsweise können Sie mit der Aggregate-Klausel für eine zugehörige Abfrageauflistung eine Berechnung ausführen. Beispiel:

' Returns the customer company name and largest 
' order amount for each customer.
Dim customerMax = From cust In customers
                  Aggregate order In cust.Orders
                  Into MaxOrder = Max(order.Amount)
                  Select cust.CompanyName, MaxOrder

Let-Klausel

Optional. Eine Let-Klausel berechnet einen Wert und weist ihn in der Abfrage einer neuen Variable zu. Beispiel:

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products
                         Let Discount = prod.UnitPrice * 0.1
                         Where Discount >= 50
                         Select prod.Name, prod.UnitPrice, Discount

Distinct-Klausel

Optional. Eine Distinct-Klausel schränkt die Werte der aktuellen Iterationsvariable ein, sodass im Abfrageergebnis keine doppelten Werte vorkommen. Beispiel:

' Returns a list of cities with no duplicate entries.
Dim cities = From item In customers
             Select item.City
             Distinct

Skip-Klausel

Optional. Eine Skip-Klausel überspringt eine festgelegte Anzahl von Elementen in einer Auflistung und gibt anschließend die übrigen Elemente zurück. Beispiel:

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers
                   Skip 10

SkipWhile-Klausel

Optional. Eine Skip While-Klausel überspringt Elemente in einer Auflistung, solange eine angegebene Bedingung true ist, und gibt anschließend die übrigen Elemente zurück. Beispiel:

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers
                   Skip While IsSubscriber(cust)

Take-Klausel

Optional. Eine Take-Klausel gibt eine angegebene Anzahl von zusammenhängenden Elementen vom Anfang einer Auflistung zurück. Beispiel:

' Returns the first 10 customers.
Dim customerList = From cust In customers
                   Take 10

TakeWhile-Klausel

Optional. Eine Take While-Klausel gibt Elemente in einer Auflistung zurück, solange eine angegebene Bedingung true ist, und überspringt dann die übrigen Elemente. Beispiel:

' Returns a list of customers. The query returns
' customers until the first customer for whom 
' HasOrders returns false. That customer and all 
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers
                          Order By cust.Orders.Count Descending
                          Take While HasOrders(cust)

Verwenden zusätzlicher LINQ-Abfragefeatures

Sie können weitere LINQ-Abfragefeatures verwenden, indem Sie die von LINQ bereitgestellten Member des Enumerable-Typs und des Queryable-Typs aufrufen. Sie können diese zusätzlichen Funktionen verwenden, indem Sie für das Ergebnis eines Abfrageausdrucks einen bestimmten Abfrageoperator aufrufen. Im folgenden Beispiel wird die Enumerable.Union-Methode verwendet, um die Ergebnisse von zwei Abfragen zu einem Abfrageergebnis zusammenzufassen. Mithilfe der Enumerable.ToList-Methode wird das Abfrageergebnis als generische Liste zurückgegeben.

Public Function GetAllCustomers() As List(Of Customer)
    Dim customers1 = From cust In domesticCustomers
    Dim customers2 = From cust In internationalCustomers

    Dim customerList = customers1.Union(customers2)

    Return customerList.ToList()
End Function

Ausführliche Informationen zu weiteren LINQ-Funktionen finden Sie unter Übersicht über Standardabfrageoperatoren.

Herstellen einer Verbindung mit einer Datenbank mithilfe von LINQ to SQL

In Visual Basic identifizieren Sie die SQL Server-Datenbankobjekte, auf die Sie zugreifen möchten (z. B. Tabellen, Sichten und gespeicherte Prozeduren), mithilfe einer LINQ to SQL-Datei. Eine LINQ to SQL-Datei hat die Erweiterung DBML.

Wenn Sie über eine gültige Verbindung mit einer SQL Server-Datenbank verfügen, können Sie Ihrem Projekt eine Elementvorlage für LINQ to SQL-Klassen hinzufügen. Dadurch wird der Object Relational Designer (O/R-Designer) angezeigt. Mit dem O/R-Designer können Sie die Elemente, auf die Sie im Code zugreifen möchten, aus dem Server-Explorer/Datenbank-Explorer auf die Designeroberfläche ziehen. Die LINQ to SQL-Datei fügt dem Projekt ein DataContext-Objekt hinzu. Zu diesem Objekt gehören Eigenschaften und Auflistungen für die Tabellen und Ansichten, auf die Sie zugreifen möchten, sowie Methoden für die gespeicherten Prozeduren, die Sie aufrufen möchten. Sobald Sie die Änderungen an der LINQ to SQL-Datei (DBML-Datei) gespeichert haben, können Sie im Code auf diese Objekte zugreifen, indem Sie auf das DataContext-Objekt verweisen, das vom O/R-Designer definiert wird. Das DataContext-Objekt des Projekts wird auf Grundlage des Namens der LINQ to SQL-Datei benannt. Beispielsweise wird aus der LINQ to SQL-Datei Northwind.dbml ein DataContext-Objekt mit dem Namen NorthwindDataContext erstellt.

Beispiele mit Schritt-für-Schritt-Anleitungen finden Sie unter Gewusst wie: Abfragen einer Datenbank mit LINQ (Visual Basic) und Gewusst wie: Aufrufen einer gespeicherten Prozedur mithilfe von LINQ (Visual Basic).

Visual Basic-Features, die LINQ unterstützen

Visual Basic enthält weitere wichtige Features, die die Verwendung von LINQ erleichtern und den Code reduzieren, den Sie zum Ausführen von LINQ-Abfragen schreiben müssen. Diese umfassen die folgenden Themen:

  • Anonyme Typen, die Ihnen das Erstellen eines neuen Typs auf Grundlage eines Abfrageergebnisses ermöglichen

  • Implizit typisierte Variablen, die Ihnen das verzögerte Angeben eines Typs ermöglichen. Dabei wird der Typ vom Compiler auf Grundlage des Abfrageergebnisses abgeleitet

  • Erweiterungsmethoden, die Ihnen das Erweitern eines vorhandenen Typs mit eigenen Methoden ermöglichen, ohne den Typ selbst zu ändern

Ausführliche Informationen finden Sie unter Visual Basic-Features, die LINQ unterstützen.

Verzögerte und unmittelbare Abfrageausführung

Die Ausführung einer Abfrage ist getrennt von der Erstellung einer Abfrage. Nachdem eine Abfrage erstellt wurde, wird ihre Ausführung durch einen separaten Mechanismus ausgelöst. Eine Abfrage kann ausgeführt werden, sobald sie definiert ist (unmittelbare Ausführung), oder die Definition kann gespeichert und die Abfrage kann später ausgeführt werden (verzögerte Ausführung).

Wenn Sie eine Abfrage erstellen, wird die Abfrage selbst standardmäßig nicht sofort ausgeführt. Stattdessen wird die Abfragedefinition in der Variablen gespeichert, die auf das Abfrageergebnis verweist. Die Abfrage wird ausgeführt, wenn Sie später im Code auf die Abfrageergebnisvariable zugreifen (z. B. in einer For…Next-Schleife). Dieser Vorgang wird als verzögerte Ausführung bezeichnet.

Abfragen können auch bei der Definition ausgeführt werden. Dieses Vorgehen wird als unmittelbare Ausführung bezeichnet. Sie können eine unmittelbare Ausführung auslösen, indem Sie eine Methode anwenden, für die ein Zugriff auf einzelne Elemente des Abfrageergebnisses erforderlich ist. Sie können dies durch Verwenden einer Aggregatfunktion wie Count, Sum, Average, Min oder Max erreichen. Weitere Informationen zu Aggregatfunktionen finden Sie unter Aggregate-Klausel (Visual Basic).

Die unmittelbare Ausführung erzwingen Sie ebenfalls mit der ToList-Methode oder der ToArray-Methode. Dies kann nützlich sein, wenn Sie die Abfrage sofort ausführen und die Ergebnisse zwischenspeichern möchten. Weitere Informationen zu diesen Methoden finden Sie unter Konvertieren von Datentypen.

Weitere Informationen zur Abfrageausführung finden Sie unter Schreiben der ersten LINQ-Abfrage (Visual Basic).

XML in Visual Basic

Zu den XML-Funktionen in Visual Basic gehören XML-Literale und XML-Achseneigenschaften, mit denen Sie im Code XML einfach erstellen, abfragen, ändern sowie darauf zugreifen können. XML-Literale ermöglichen das direkte Schreiben von XML im Code. Der Visual Basic-Compiler behandelt das XML als Datenobjekt erster Klasse.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein XML-Element erstellen, auf seine Unterelemente und Attribute zugreifen und die Inhalte des Elements mit LINQ abfragen.

' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1

    Sub SampleTransform()

        ' Create test by using a global XML namespace prefix.

        Dim contact =
            <ns:contact>
                <ns:name>Patrick Hines</ns:name>
                <ns:phone ns:type="home">206-555-0144</ns:phone>
                <ns:phone ns:type="work">425-555-0145</ns:phone>
            </ns:contact>

        Dim phoneTypes =
          <phoneTypes>
              <%= From phone In contact.<ns:phone>
                  Select <type><%= phone.@ns:type %></type>
              %>
          </phoneTypes>

        Console.WriteLine(phoneTypes)
    End Sub

End Module

Weitere Informationen finden Sie unter XML in Visual Basic.

Thema BESCHREIBUNG
XML Beschreibt die XML-Funktionen in Visual Basic, die abgefragt werden können und die Ihnen ermöglichen, XML in Ihrem Visual Basic-Code als Datenobjekte erster Klasse anzugeben.
Abfragen Stellt Referenzinformationen zu den in Visual Basic verfügbaren Abfrageklauseln bereit.
LINQ (Language Integrated Query) Enthält allgemeine Informationen, Programmieranleitungen und Beispiele zu LINQ.
LINQ to SQL Enthält allgemeine Informationen, Programmieranleitungen und Beispiele zu LINQ to SQL.
LINQ to Objects Enthält allgemeine Informationen, Programmieranleitungen und Beispiele zu LINQ to Objects.
LINQ to ADO.NET (Portalseite) Enthält Links zu allgemeinen Informationen, Programmieranleitungen und Beispiele zu LINQ to ADO.NET.
LINQ to XML Enthält allgemeine Informationen, Programmieranleitungen und Beispiele zu LINQ to XML.

Anleitungen und Themen mit exemplarischen Vorgehensweisen

Gewusst wie: Abfragen einer Datenbank

Gewusst wie: Aufrufen einer gespeicherten Prozedur

Gewusst wie: Ändern von Daten in einer Datenbank

Kombinieren von Daten mithilfe von Joins

Gewusst wie: Sortieren von Abfrageergebnissen

Gewusst wie: Filtern von Abfrageergebnissen

Gewusst wie: Bestimmen von Zahlen, Summen oder Durchschnittswerten von Daten

Gewusst wie: Suchen des minimalen oder maximalen Werts in einem Abfrageergebnis

Vorgehensweise: Zuweisen von gespeicherten Prozeduren zum Durchführen von Aktionen zum Aktualisieren, Einfügen und Löschen (O/R-Designer)

Kapitel 17: LINQ in Programmieren mit Visual Basic 2008

Weitere Informationen