Share via


Gewusst wie: Schreiben von LINQ-Abfragen in C#

Dieses Thema zeigt die drei Methoden, mit denen Sie eine LINQ-Abfrage in C# schreiben können:

  1. Verwenden Sie die Abfragesyntax.

  2. Verwenden Sie die Methodensyntax.

  3. Verwenden Sie eine Kombination aus Abfragesyntax und Methodensyntax.

In den folgenden Beispielen werden einige einfache LINQ-Abfragen veranschaulicht, indem sie jeden zuvor aufgelisteten Ansatz verwenden. Im Allgemeinen muss die Regel wann immer möglich (1) verwenden und wann immer notwendig (2) und (3) verwenden.

Hinweis

Diese Abfragen basieren auf einfachen speicherinternen Auflistungen; die grundlegende Syntax ist jedoch mit der in LINQ to SQL und LINQ to XML verwendeten identisch.

Beispiel

Abfragesyntax

Es wird empfohlen, die meisten Abfragen mit Abfragesyntax zu schreiben, um Abfrageausdrücke zu erstellen. Im folgenden Beispiel werden drei Abfrageausdrücke veranschaulicht. Der erste Abfrageausdruck zeigt, wie Ergebnisse gefiltert oder eingeschränkt werden, indem Sie Bedingungen mit einer where-Klausel anwenden. Er gibt alle Elemente in der Quellsequenz zurück, deren Werte größer als 7 oder kleiner als 3 sind. Der zweite Ausdruck zeigt, wie die zurückgegebenen Ergebnisse sortiert werden. Der dritte Ausdruck veranschaulicht, wie Ergebnisse anhand eines Schlüssels gruppiert werden. Diese Abfrage gibt zwei Gruppen basierend auf dem Buchstaben des Worts zurück.

// 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 die Abfragen vom Typ IEnumerable sind. Alle diese Abfragen konnten mit var geschrieben werden, wie im folgenden Beispiel gezeigt:

var query = from num in numbers...

In jedem vorherigen Beispiel werden die Abfragen erst dann ausgeführt, wenn Sie die Abfragevariable in einer foreach-Anweisung durchlaufen. Weitere Informationen hierzu finden Sie unter Einführung in LINQ-Abfragen (C#).

Methodensyntax

Einige Abfrageoperationen müssen als Methodenaufruf ausgedrückt werden. Die am häufigsten verwendeten Methoden sind jene, die einzelne numerische Werte zurückgeben, z. B. Sum, Max, Min, Average. Diese Methoden müssen immer zuletzt in einer Abfrage aufgerufen werden, da sie nur einen einzelnen Wert darstellen und nicht als Quelle für eine zusätzliche Abfrageoperation dienen. Das folgende Beispiel zeigt einen Methodenaufruf in einem Abfrageausdruck:

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);

Wenn die Methode über Parameter verfügt, werden diese in Form eines Lambda-Ausdrucks bereitgestellt, wie im folgenden Beispiel gezeigt:

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

In den vorherigen Abfragen wird nur Abfrage 4 sofort ausgeführt. Das liegt daran, dass sie einen einzelnen Wert und nicht eine generische IEnumerable-Auflistung zurückgibt. Die Methode selbst muss foreach verwenden, um den Wert zu berechnen.

Alle diese vorherigen Abfragen können mithilfe der impliziten Typisierung mit var geschrieben werden, wie im folgenden Beispiel gezeigt wird:

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

Gemischte Abfrage und Methodensyntax

Dieses Beispiel zeigt, wie die Methodensyntax für Ergebnisse einer Abfrageklausel verwendet wird. Schließen Sie den Abfrageausdruck in Klammern ein, wenden Sie dann den Punktoperator an, und rufen Sie die Methode auf. Im folgenden Beispiel gibt Abfrage 7 eine Anzahl der Zahlen zurück, deren Wert zwischen 3 und 7 liegt. Im Allgemeinen ist es jedoch besser, eine zweite Variable zum Speichern der Ergebnisse des Methodenaufrufs zu verwenden. Auf diese Weise kann die Abfrage nicht so leicht mit den Ergebnissen der Abfrage verwechselt werden.

// 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 7 einen einzelnen Wert und keine Auflistung zurückgibt, wird die Abfrage sofort ausgeführt.

Die vorherige Abfrage kann mithilfe der impliziten Typisierung mit var folgendermaßen geschrieben werden:

var numCount = (from num in numbers...

Sie kann folgendermaßen in Methodensyntax geschrieben werden:

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

Sie kann folgendermaßen mit expliziter Typisierung geschrieben werden:

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

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ)

Referenz

where-Klausel (C#-Referenz)

Konzepte

LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

Weitere Ressourcen

LINQ (Language-Integrated Query, sprachintegrierte Abfrage)