Im folgenden Beispiel werden ein einfacher Abfrageausdruck und die semantisch ähnliche Abfrage gezeigt, die als methodenbasierte Abfrage geschrieben wird.
class QueryVMethodSyntax
{
static void Main()
{
int[] numbers = { 5, 10, 8, 3, 6, 12};
//Query syntax:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
foreach (int i in numQuery1)
{
Console.Write(i + " ");
}
Console.WriteLine(System.Environment.NewLine);
foreach (int i in numQuery2)
{
Console.Write(i + " ");
}
// Keep the console open in debug mode.
Console.WriteLine(System.Environment.NewLine);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
/*
Output:
6 8 10 12
6 8 10 12
*/
Die Ausgabe der beiden Beispiele ist identisch.
Sie können sehen, dass der Typ der Abfragevariablen in beiden Fällen der gleiche ist: IEnumerable<T>.
Um methodenbasierte Abfragen zu verstehen, müssen wir sie genauer untersuchen.
Auf der rechten Seite des Ausdrucks wird die where-Klausel jetzt als Instanzenmethode für das numbers-Objekt ausgedrückt, das wie bereits erwähnt vom Typ IEnumerable<int> ist. Wenn Sie mit der generischen IEnumerable<T>-Schnittstelle vertraut sind, wissen Sie, dass diese keine Where-Methode aufweist. Wenn Sie jedoch die IntelliSense-Vervollständigungsliste in der Visual Studio IDE aufrufen, sehen Sie nicht nur eine Where-Methode, sondern auch viele anderen Methoden, z. B. Select, SelectMany, Join und Orderby. Dies sind alle Standardabfrageoperatoren.
Obwohl es scheint, als ob IEnumerable<T> so umdefiniert wurde, das diese zusätzlichen Methoden enthalten sind, ist dies in der Tat nicht der Fall.
Die Standardabfrageoperatoren werden als neue Art von Methode mit der Bezeichnung Erweiterungsmethoden implementiert. Erweiterungsmethoden "erweitern" einen vorhandenen Typ; sie können wie Instanzenmethoden für den Typ aufgerufen werden. Die Standardabfrageoperatoren erweitern IEnumerable<T>, und daher können Sie numbers.Where(...) schreiben.
Um mit der Verwendung von LINQ zu beginnen, müssen Sie lediglich wissen, wie Sie die Erweiterungsmethoden in Ihre Anwendung unter Verwendung der richtigen using-Direktiven einbinden.
Dies wird darüber hinaus in Gewusst wie: Erstellen eines LINQ-Projekts erklärt. Aus der Perspektive der Anwendung sind eine Erweiterungsmethode und eine reguläre Instanzenmethode das Gleiche.
Weitere Informationen über Erweiterungsmethoden finden Sie unter Erweiterungsmethoden (C#-Programmierhandbuch).
Weitere Informationen über Standardabfrageoperatoren finden Sie unter Übersicht über Standardabfrageoperatoren. Einige LINQ-Anbieter, wie z. B. LINQ to SQL und LINQ to XML, implementieren ihre eigenen Standardabfrageoperatoren und zusätzlichen Erweiterungsmethoden für andere Typen außer IEnumerable<T>.