Schreiben von LINQ-Abfragen in C#Write LINQ queries in C#

In diesem Thema werden alle drei Möglichkeiten vorgestellt, mit denen man eine LINQ-Abfrage in C# schreiben kann:This topic shows the three ways in which you can write a LINQ query in C#:

  1. Verwenden der Abfragesyntax.Use query syntax.

  2. Verwenden der Methodensyntax.Use method syntax.

  3. Verwenden einer Kombination aus Abfragesyntax und Methodensyntax.Use a combination of query syntax and method syntax.

Die folgenden Beispiele veranschaulichen einige einfache LINQ-Abfragen anhand der oben aufgelisteten Herangehensweisen.The following examples demonstrate some simple LINQ queries by using each approach listed previously. Im Allgemeinen gilt die Regel, wann immer möglich (1) zu verwenden, und (2) und (3) wenn nötig.In general, the rule is to use (1) whenever possible, and use (2) and (3) whenever necessary.

Hinweis

Diese Abfragen funktionieren auf Grundlage einfacher im Speicher enthaltener Auflistungen; die grundlegende Syntax entspricht jedoch genau der in „LINQ to Entities“ und „LINQ to XML“ verwendeten Syntax.These queries operate on simple in-memory collections; however, the basic syntax is identical to that used in LINQ to Entities and LINQ to XML.

BeispielExample

AbfragesyntaxQuery syntax

Die empfohlene Methode, die meisten Abfragen zu schreiben, ist die Verwendung der Abfragesyntax zum Erstellen von Abfrageausdrücken.The recommended way to write most queries is to use query syntax to create query expressions. Im folgenden Beispiel werden drei Abfrageausdrücke gezeigt.The following example shows three query expressions. Der erste Abfrageausdruck veranschaulicht, wie man Ergebnisse durch Anwenden von Bedingungen mit einer where-Klausel filtern und einschränken kann.The first query expression demonstrates how to filter or restrict results by applying conditions with a where clause. Er gibt alle Elemente in der Quellsequenz zurück, deren Wert größer als 7 oder kleiner als 3 ist.It returns all elements in the source sequence whose values are greater than 7 or less than 3. Der zweite Ausdruck veranschaulicht, wie man die zurückgegebenen Ergebnisse sortiert.The second expression demonstrates how to order the returned results. Der dritte Ausdruck veranschaulicht, wie man Ergebnisse nach einem Schlüssel gruppiert.The third expression demonstrates how to group results according to a key. Diese Abfrage gibt basierend auf dem ersten Buchstaben des Worts zwei Gruppen zurück.This query returns two groups based on the first letter of the word.

// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
    from num in numbers
    where num < 3 || num > 7
    select num;

// Query #2.
IEnumerable<int> orderingQuery =
    from num in numbers
    where num < 3 || num > 7
    orderby num ascending
    select num;

// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
    from item in groupingQuery
    group item by item[0];

Beachten Sie, dass der Typ der Abfrage IEnumerable<T> ist.Note that the type of the queries is IEnumerable<T>. Alle diese Abfragen können mithilfe von var geschrieben werden, wie im folgenden Beispiel gezeigt wird:All of these queries could be written using var as shown in the following example:

var query = from num in numbers...

In allen vorherigen Beispielen werden die Abfragen nicht ausgeführt, bis Sie die Iteration über die Abfragevariable in einer foreach- oder einer anderen Anweisung durchlaufen haben.In each previous example, the queries do not actually execute until you iterate over the query variable in a foreach statement or other statement. Weitere Informationen finden Sie unter Introduction to LINQ Queries (Einführung in LINQ-Abfragen).For more information, see Introduction to LINQ Queries.

BeispielExample

MethodensyntaxMethod syntax

Einige Abfragevorgänge müssen als Methodenaufruf ausgedrückt werden.Some query operations must be expressed as a method call. Die häufigsten derartigen Methoden sind die, die einzelne numerische Werte zurückgeben, wie z.B. Sum, Max, Min, Average usw.The most common such methods are those that return singleton numeric values, such as Sum, Max, Min, Average, and so on. Diese Methoden müssen in einer Abfrage immer zuletzt aufgerufen werden, da sie nur einen einzelnen Wert darstellen und nicht als Quelle für einen zusätzlichen Abfragevorgang dienen können.These methods must always be called last in any query because they represent only a single value and cannot serve as the source for an additional query operation. Im folgenden Beispiel wird ein Methodenaufruf in einem Abfrageausdruck dargestellt:The following example shows a method call in a query expression:

List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
// Query #4.
double average = numbers1.Average();

// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

BeispielExample

Wenn die Methode über Aktions- oder Func-Parameter verfügt, werden diese in Form eines Lambdaausdruckes zur Verfügung gestellt, wie im folgenden Beispiel gezeigt wird:If the method has Action or Func parameters, these are provided in the form of a lambda expression, as shown in the following example:

// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

Von den vorherigen Abfragen wird nur die vierte Abfrage sofort ausgeführt.In the previous queries, only Query #4 executes immediately. Dies liegt daran, dass es einen einzelnen Wert zurückgibt und keine generische IEnumerable<T>-Auflistung.This is because it returns a single value, and not a generic IEnumerable<T> collection. Die Methode selbst muss foreach verwenden, um einen Wert zu berechnen.The method itself has to use foreach in order to compute its value.

Alle vorherigen Abfragen können mithilfe von implizierter Typisierung mit var geschrieben werden. Dies wird im folgenden Beispiel gezeigt:Each of the previous queries can be written by using implicit typing with var, as shown in the following example:

// var is used for convenience in these queries
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);

BeispielExample

Gemischte Abfrage und MethodensyntaxMixed query and method syntax

In diesem Beispiel wird veranschaulicht, wie Sie die Methodensyntax auf die Ergebnisse einer Abfrageklausel anwenden können.This example shows how to use method syntax on the results of a query clause. Umschließen Sie einfach den Abfrageausdruck mit Klammern, wenden Sie anschließend den Punktoperator an, und rufen Sie die Methode auf.Just enclose the query expression in parentheses, and then apply the dot operator and call the method. Im folgenden Beispiel wird von der siebten Abfrage die Anzahl der Zahlen zurückgegeben, deren Wert zwischen 3 und 7 liegt.In the following example, query #7 returns a count of the numbers whose value is between 3 and 7. Im Allgemeinen ist es jedoch besser, eine zweite Variable zu verwenden, um das Ergebnis des zweiten Methodenaufrufs zu speichern.In general, however, it is better to use a second variable to store the result of the method call. Auf diese Weise ist es unwahrscheinlicher, dass dieses Ergebnis mit dem Ergebnis der Abfrage verwechselt wird.In this manner, the query is less likely to be confused with the results of the query.

// Query #7.

// Using a query expression with method syntax
int numCount1 =
    (from num in numbers1
     where num < 3 || num > 7
     select num).Count();

// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
    from num in numbers1
    where num < 3 || num > 7
    select num;

int numCount2 = numbersQuery.Count();

Da Abfrage Nr.7 einen einzelnen Wert und keine Auflistung zurückgibt, wird die Abfrage sofort ausgeführt.Because Query #7 returns a single value and not a collection, the query executes immediately.

Die vorherige Abfrage kann mithilfe der implizierten Typisierung mit var wie folgt geschrieben werden:The previous query can be written by using implicit typing with var, as follows:

var numCount = (from num in numbers...  

Sie kann folgendermaßen in Methodensyntax geschrieben werden:It can be written in method syntax as follows:

var numCount = numbers.Where(n => n < 3 || n > 7).Count();  

Sie kann mithilfe der implizierten Typisierung wie folgt geschrieben werden:It can be written by using explicit typing, as follows:

int numCount = numbers.Where(n => n < 3 || n > 7).Count();  

Siehe auchSee Also

Exemplarische Vorgehensweise: Schreiben von Abfragen in C# Walkthrough: Writing Queries in C#
LINQ-AbfrageausdrückeLINQ Query Expressions
where-Klauselwhere clause