Grundlegende LINQ-Abfragevorgänge (C#)Basic LINQ Query Operations (C#)

Dieses Thema gibt einen kurzen Überblick über LINQLINQ-Abfrageausdrücke und einige der geläufigsten Vorgänge, die Sie in einer Abfrage durchführen können.This topic gives a brief introduction to LINQLINQ query expressions and some of the typical kinds of operations that you perform in a query. Ausführlichere Informationen finden Sie unter den folgenden Themen:More detailed information is in the following topics:

LINQ-AbfrageausdrückeLINQ Query Expressions

Standard Query Operators Overview (C#) (Übersicht über Standardabfrageoperatoren (C#))Standard Query Operators Overview (C#)

Walkthrough: Writing Queries in C# (Exemplarische Vorgehensweise: Schreiben von Abfragen in C#)Walkthrough: Writing Queries in C#

Hinweis

Wenn Sie sich bereits mit einer Abfragesprache wie SQL oder XQuery auskennen, können Sie einen Großteil dieses Themas überspringen.If you already are familiar with a query language such as SQL or XQuery, you can skip most of this topic. Im nächsten Abschnitt erfahren Sie mehr über die from-Klausel und die Reihenfolge von Klauseln in einem LINQLINQ-Abfrageausdruck.Read about the "from clause" in the next section to learn about the order of clauses in LINQLINQ query expressions.

Abrufen einer DatenquelleObtaining a Data Source

Der erste Schritt für eine LINQLINQ-Abfrage ist das Festlegen einer Datenquelle.In a LINQLINQ query, the first step is to specify the data source. Wie in den meisten Programmiersprachen muss eine Variable in C# vor ihrer Verwendung deklariert werden.In C# as in most programming languages a variable must be declared before it can be used. In einer LINQLINQ-Abfrage steht die from-Klausel an erster Stelle; sie führt die Datenquelle (customers) und die Bereichsvariable (cust) ein.In a LINQLINQ query, the from clause comes first in order to introduce the data source (customers) and the range variable (cust).

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;

Die Bereichsvariable befindet sich wie die Iterationvariable in einer foreach-Schleife, mit dem Unterschied, dass in einem Abfrageausdruck keine Iterationen vorkommen.The range variable is like the iteration variable in a foreach loop except that no actual iteration occurs in a query expression. Wenn die Abfrage ausgeführt wird, fungiert die Bereichsvariable als Verweis auf jedes aufeinanderfolgende Element in customers.When the query is executed, the range variable will serve as a reference to each successive element in customers. Es ist nicht notwendig, diese explizit anzugeben, da der Compiler den Typ von cust ableitet.Because the compiler can infer the type of cust, you do not have to specify it explicitly. Weitere Bereichsvariablen können mithilfe der let-Klausel eingefügt werden.Additional range variables can be introduced by a let clause. Weitere Informationen finden Sie unter let-Klausel.For more information, see let clause.

Hinweis

Die Bereichsvariable muss für nicht generische Datenquellen wie ArrayList explizit typisiert sein.For non-generic data sources such as ArrayList, the range variable must be explicitly typed. Weitere Informationen finden Sie unter Vorgehensweise: Abfragen von ArrayList mit LINQ (C#) und from-Klausel.For more information, see How to: Query an ArrayList with LINQ (C#) and from clause.

FilternFiltering

Die wahrscheinlich üblichste Abfrageoperation ist das Anwenden eines Filters in Form eines booleschen Ausdrucks.Probably the most common query operation is to apply a filter in the form of a Boolean expression. Das Filtern bewirkt, dass die Abfrage nur jene Elemente zurückgibt, für die der Ausdruck den Wert TRUE hat.The filter causes the query to return only those elements for which the expression is true. Das Ergebnis wird durch Verwendung der where-Klausel erzeugt.The result is produced by using the where clause. Faktisch gibt der Filter an, welche Elemente nicht in die Quellsequenz eingeschlossen werden sollen.The filter in effect specifies which elements to exclude from the source sequence. In folgendem Beispiel werden nur die customers zurückgegeben, die eine Londoner Adresse haben.In the following example, only those customers who have an address in London are returned.

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;

Sie können die geläufigen logischen C#-Operatoren AND und OR verwenden, um so viele Filterausdrücke wie benötigt in der where-Klausel anzuwenden.You can use the familiar C# logical AND and OR operators to apply as many filter expressions as necessary in the where clause. Wenn Sie z.B. nur Kunden aus „London“ zurückgeben möchten, deren Name „Devon“ ist, können Sie dazu AND verwenden wie in folgendem Codebeispiel:For example, to return only customers from "London" AND whose name is "Devon" you would write the following code:

where cust.City=="London" && cust.Name == "Devon"

Um Kunden aus London oder Paris zurückzugeben, verwenden Sie folgenden Code:To return customers from London or Paris, you would write the following code:

where cust.City == "London" || cust.City == "Paris"

Weitere Informationen finden Sie unter where-Klausel.For more information, see where clause.

SortierenOrdering

Es kann häufig praktisch sein, die zurückgegebenen Daten zu sortieren.Often it is convenient to sort the returned data. Die orderby-Klausel sortiert die Elemente in der zurückgegebenen Sequenz anhand des Standardcomparers für den zu sortierenden Typ.The orderby clause will cause the elements in the returned sequence to be sorted according to the default comparer for the type being sorted. Die folgende Abfrage kann z.B. so erweitert werden, dass Sie die Ergebnisse nach der Eigenschaft Name sortiert.For example, the following query can be extended to sort the results based on the Name property. Der Standardcomparer nimmt eine Sortierung in alphabetischer Reihenfolge (A bis Z) vor, das es sich bei Name um eine Zeichenfolge handelt.Because Name is a string, the default comparer performs an alphabetical sort from A to Z.

var queryLondonCustomers3 = 
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;

Wenn Sie die Ergebnisse andersherum, von Z bis A, sortieren möchten, können Sie die orderby…descending-Klausel verwenden.To order the results in reverse order, from Z to A, use the orderby…descending clause.

Weitere Informationen finden Sie unter orderby-Klausel.For more information, see orderby clause.

GruppierungGrouping

Die group-Klausel ermöglicht Ihnen, die Ergebnisse auf Grundlage eines von Ihnen angegebenen Schlüssels zu gruppieren.The group clause enables you to group your results based on a key that you specify. Sie können z.B. angeben, dass die Ergebnisse nach City gruppiert werden sollen, sodass sich alle Kunden aus London oder Paris in einer einzelnen Gruppe befinden.For example you could specify that the results should be grouped by the City so that all customers from London or Paris are in individual groups. In diesem Fall ist cust.City der Schlüssel.In this case, cust.City is the key.

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }

Wenn Sie eine Abfrage mit einer group-Klausel beenden, werden Ihre Ergebnisse in einer Liste aus Listen zurückgegeben.When you end a query with a group clause, your results take the form of a list of lists. Jedes Element auf der Liste ist ein Objekt, dass über einen Key-Member und eine Liste von Elementen verfügt, die anhand dieses Schlüssels gruppiert wurden.Each element in the list is an object that has a Key member and a list of elements that are grouped under that key. Wenn Sie eine Abfrage durchlaufen, die eine Sequenz von Gruppen erzeugt, müssen Sie eine geschachtelte foreach-Schleife verwenden.When you iterate over a query that produces a sequence of groups, you must use a nested foreach loop. Die äußere Schleife durchläuft jede Gruppe, und die innere Schleife durchläuft alle Member jeder Gruppe.The outer loop iterates over each group, and the inner loop iterates over each group's members.

Wenn Sie auf die Ergebnisse eines Gruppenvorgangs verweisen müssen, könne Sie das Schlüsselwort into verwenden, um einen Bezeichner zu erstellen, der weiter abgefragt werden kann.If you must refer to the results of a group operation, you can use the into keyword to create an identifier that can be queried further. Die folgende Abfrage gibt nur die Gruppen zurück, die mehr als zwei Kunden enthalten:The following query returns only those groups that contain more than two customers:

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;

Weitere Informationen finden Sie unter group-Klausel.For more information, see group clause.

VerknüpfenJoining

Verknüpfungsvorgänge erstellen Verknüpfungen zwischen Sequenzen, die nicht explizit in der Datenquelle modelliert werden.Join operations create associations between sequences that are not explicitly modeled in the data sources. Sie können z.B. eine Verknüpfung erstellen, um alle Kunden und Händler mit demselben Standort ausfindig zu machen.For example you can perform a join to find all the customers and distributors who have the same location. In LINQLINQ arbeitet die join-Klausel immer mit Objektauflistungen statt direkt mit Datenbanktabellen.In LINQLINQ the join clause always works against object collections instead of database tables directly.

var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };

In LINQLINQ müssen Sie nicht join so oft wie in SQL verwenden, da Fremdschlüssel in LINQLINQ im Objektmodell als Eigenschaften repräsentiert werden, die eine Elementauflistung enthalten.In LINQLINQ you do not have to use join as often as you do in SQL because foreign keys in LINQLINQ are represented in the object model as properties that hold a collection of items. Ein Customer-Objekt enthält z.B. eine Auflistung von Order-Objekten.For example, a Customer object contains a collection of Order objects. Sie können auf die Bestellungen zugreifen, indem Sie Punktnotation statt einer Verknüpfung verwenden:Rather than performing a join, you access the orders by using dot notation:

from order in Customer.Orders...  

Weitere Informationen finden Sie unter join-Klausel.For more information, see join clause.

Auswählen (Projektionen)Selecting (Projections)

Die select-Klausel erzeugt die Ergebnisse der Abfrage und gibt die „Form“ oder den Typ jedes zurückgegebenen Elements an.The select clause produces the results of the query and specifies the "shape" or type of each returned element. Sie können z.B. bestimmen, ob Ihre Ergebnisse aus vollständigen Customer-Objekte, aus lediglich einem Member, aus einer Teilmenge von Membern oder aus einem ganz anderen Ergebnistyp, der auf einer Berechnung oder einem neu erstellten Objekt basiert, bestehen sollen.For example, you can specify whether your results will consist of complete Customer objects, just one member, a subset of members, or some completely different result type based on a computation or new object creation. Wenn die select-Klausel etwas anderes als eine Kopie des Quellelements erzeugt, wird dieser Vorgang als Projektion bezeichnet.When the select clause produces something other than a copy of the source element, the operation is called a projection. Das Verwenden von Projektionen zur Datentransformation ist eine leistungsfähige Funktion von LINQLINQ-Abfrageausdrücken.The use of projections to transform data is a powerful capability of LINQLINQ query expressions. Weitere Informationen finden Sie unter Datentransformationen mit LINQ (C#) und select-Klausel.For more information, see Data Transformations with LINQ (C#) and select clause.

Siehe auchSee Also

Erste Schritte mit LINQ in C#Getting Started with LINQ in C#
LINQ-AbfrageausdrückeLINQ Query Expressions
Walkthrough (Exemplarische Vorgehensweise: Schreiben von Abfragen in C#)Walkthrough: Writing Queries in C#
Abfrageschlüsselwörter (LINQ)Query Keywords (LINQ)
Anonyme TypenAnonymous Types