Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)Language Integrated Query (LINQ)

Language Integrated Query (LINQ) bezeichnet einen Satz Technologien, die auf der direkten Integration der Abfragefunktionen in die Sprache C# basieren.Language-Integrated Query (LINQ) is the name for a set of technologies based on the integration of query capabilities directly into the C# language. Abfragen von Daten werden gewöhnlich als einfache Zeichenfolgen ohne Typüberprüfung zur Kompilierzeit und ohne IntelliSense-Unterstützung ausgedrückt.Traditionally, queries against data are expressed as simple strings without type checking at compile time or IntelliSense support. Darüber hinaus müssen Sie für jede Art von Datenquelle eine andere Abfragesprache erlernen: SQL-Datenbanken, XML-Dokumente, verschiedene Webdienste usw.Furthermore, you have to learn a different query language for each type of data source: SQL databases, XML documents, various Web services, and so on. Bei LINQ ist eine Abfrage ein erstklassiges Sprachkonstrukt, genauso wie Klassen, Methoden oder Ereignisse.With LINQ, a query is a first-class language construct, just like classes, methods, events.

Für einen Entwickler, der Abfragen schreibt, ist der sichtbarste „sprachintegrierte“ Teil von LINQ der Abfrageausdruck.For a developer who writes queries, the most visible "language-integrated" part of LINQ is the query expression. Abfrageausdrücke werden in einer deklarativen Abfragesyntax geschrieben.Query expressions are written in a declarative query syntax. Mit der Abfragesyntax können Sie mit minimalem Codeeinsatz Filter-, Sortier- und Gruppiervorgänge in Datenquellen ausführen.By using query syntax, you can perform filtering, ordering, and grouping operations on data sources with a minimum of code. Sie verwenden die gleichen grundlegenden Abfrageausdrucksmuster, um Daten in SQL-Datenbanken, ADO. NET-Datasets, XML-Dokumenten und -Streams sowie .NET-Auflistungen abzufragen und zu transformieren.You use the same basic query expression patterns to query and transform data in SQL databases, ADO .NET Datasets, XML documents and streams, and .NET collections.

Das folgende Beispiel zeigt den vollständigen Abfragevorgang.The following example shows the complete query operation. Der vollständige Vorgang umfasst die Erstellung einer Datenquelle, die Definition des Abfrageausdrucks und die Ausführung der Abfrage in einer foreach-Anweisung.The complete operation includes creating a data source, defining the query expression, and executing the query in a foreach statement.

class LINQQueryExpressions
{
    static void Main()
    {
        
        // Specify the data source.
        int[] scores = new int[] { 97, 92, 81, 60 };

        // Define the query expression.
        IEnumerable<int> scoreQuery =
            from score in scores
            where score > 80
            select score;

        // Execute the query.
        foreach (int i in scoreQuery)
        {
            Console.Write(i + " ");
        }            
    }
}
// Output: 97 92 81

Übersicht über AbfrageausdrückeQuery expression overview

  • Abfrageausdrücke können verwendet werden, um Daten aus einer beliebigen LINQ-fähigen Datenquelle abzufragen und zu transformieren.Query expressions can be used to query and to transform data from any LINQ-enabled data source. Mit einer einzigen Abfrage können z.B. Daten aus einer SQL-Datenbank abgerufen und ein XML-Stream als Ausgabe generiert werden.For example, a single query can retrieve data from a SQL database, and produce an XML stream as output.

  • Die Arbeit mit Abfrageausdrücken ist einfach, da sie viele vertraute Konstrukte der Sprache C# verwenden.Query expressions are easy to master because they use many familiar C# language constructs.

  • Alle Variablen in einem Abfrageausdruck sind stark typisiert, obwohl Sie den Typ in vielen Fällen nicht explizit angeben müssen, da der Compiler ihn ableiten kann.The variables in a query expression are all strongly typed, although in many cases you do not have to provide the type explicitly because the compiler can infer it. Weitere Informationen finden Sie unter Typbeziehungen in LINQ-Abfragevorgängen.For more information, see Type relationships in LINQ query operations.

  • Eine Abfrage wird erst ausgeführt, wenn Sie die Abfragevariable durchlaufen, z.B. in einer foreach-Anweisung.A query is not executed until you iterate over the query variable, for example, in a foreach statement. Weitere Informationen finden Sie unter Einführung in LINQ-Abfragen.For more information, see Introduction to LINQ queries.

  • Zur Kompilierzeit werden Abfrageausdrücke gemäß den in der C#-Spezifikation festgelegten Regeln in Methodenaufrufe des Standardabfrageoperators konvertiert.At compile time, query expressions are converted to Standard Query Operator method calls according to the rules set forth in the C# specification. Jede Abfrage, die mithilfe der Abfragesyntax ausgedrückt werden kann, kann auch mithilfe der Methodensyntax ausgedrückt werden.Any query that can be expressed by using query syntax can also be expressed by using method syntax. In den meisten Fällen ist aber die Abfragesyntax präziser und besser lesbar.However, in most cases query syntax is more readable and concise. Weitere Informationen finden Sie unter Spezifikation für die Sprache C# und Übersicht über Standardabfrageoperatoren.For more information, see C# language specification and Standard query operators overview.

  • Beim Schreiben von LINQ-Abfragen empfiehlt sich diese Faustregel: Verwenden Sie die Abfragesyntax, wann immer es möglich ist, und verwenden Sie die Methodensyntax nur, wenn es nötig ist.As a rule when you write LINQ queries, we recommend that you use query syntax whenever possible and method syntax whenever necessary. Zwischen den beiden Formen gibt es keine semantischen oder leistungsbezogenen Unterschiede.There is no semantic or performance difference between the two different forms. Abfrageausdrücke sind oft besser lesbar als die entsprechenden in der Methodensyntax geschriebenen Ausdrücke.Query expressions are often more readable than equivalent expressions written in method syntax.

  • Für einige Abfragevorgänge, wie z.B. Count oder Max, gibt es keine entsprechende Abfrageausdrucksklausel, daher müssen diese als Methodenaufruf ausgedrückt werden.Some query operations, such as Count or Max, have no equivalent query expression clause and must therefore be expressed as a method call. Die Methodensyntax kann auf verschiedene Weise mit der Abfragesyntax kombiniert werden.Method syntax can be combined with query syntax in various ways. Weitere Informationen finden Sie unter Abfragesyntax und Methodensyntax in LINQ.For more information, see Query syntax and method syntax in LINQ.

  • Abfrageausdrücke können in Ausdrucksbaumstrukturen oder Delegaten kompiliert werden, je nachdem, auf welchen Typ die Abfrage angewendet wird.Query expressions can be compiled to expression trees or to delegates, depending on the type that the query is applied to. IEnumerable<T>-Abfragen werden zu Delegaten kompiliert.IEnumerable<T> queries are compiled to delegates. IQueryable- und IQueryable<T>-Abfragen werden zu Ausdrucksbaumstrukturen kompiliert.IQueryable and IQueryable<T> queries are compiled to expression trees. Weitere Informationen finden Sie unter Ausdrucksbaumstrukturen.For more information, see Expression trees.

Nächste SchritteNext steps

Um mehr zu LINQ zu erfahren, machen Sie sich zunächst unter Grundlagen zu Abfrageausdrücken mit einigen grundlegenden Konzepten vertraut, und lesen Sie dann die Dokumentation für die LINQ-Technologie, die Sie interessiert:To learn more details about LINQ, start by becoming familiar with some basic concepts in Query expression basics, and then read the documentation for the LINQ technology in which you are interested:

Tiefer greifende Einblicke in LINQ im Allgemeinen erhalten Sie unter LINQ in C#.To gain a deeper understanding of LINQ in general, see LINQ in C#.

Informationen zu den ersten Schritten mit LINQ in C# erhalten Sie im Tutorial Arbeiten mit LINQ.To start working with LINQ in C#, see the tutorial Working with LINQ.