Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Language-Integrated Query (LINQ) ist der Name für eine Reihe von Technologien, die auf der Integration von Abfragefunktionen direkt in die C#-Sprache basieren. Traditionell werden Abfragen für Daten als einfache Zeichenfolgen ohne Typüberprüfung während der Kompilierungszeit oder Unterstützung von IntelliSense ausgedrückt. Darüber hinaus müssen Sie für jeden Datenquellentyp eine andere Abfragesprache erlernen: SQL-Datenbanken, XML-Dokumente, verschiedene Webdienste usw. Bei LINQ ist eine Abfrage ein erstklassiges Sprachkonstrukt, genau wie Klassen, Methoden und Ereignisse.
Beim Verfassen von Abfragen ist der sichtbarste Teil der sprachintegrierten LINQ-Funktion der Abfrageausdruck. Abfrageausdrücke werden in einer deklarativen Abfragesyntax geschrieben. Mithilfe der Abfragesyntax führen Sie Filter-, Sortier- und Gruppierungsvorgänge für Datenquellen mit mindestens einem Code aus. Sie verwenden dieselben Abfrageausdrucksmuster, um Daten aus einer beliebigen Datenquelle abzufragen und zu transformieren.
Das folgende Beispiel zeigt einen vollständigen Abfragevorgang. Der vollständige Vorgang umfasst das Erstellen einer Datenquelle, das Definieren des Abfrageausdrucks und das Ausführen der Abfrage in einer foreach
Anweisung.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Möglicherweise müssen Sie eine using
Direktive hinzufügen, using System.Linq;
damit das vorherige Beispiel kompiliert werden kann. Die neuesten Versionen von .NET verwenden implizite Verwendungen , um diese Direktive als globale Verwendung hinzuzufügen. Ältere Versionen erfordern, dass Sie sie in Ihrer Quelle hinzufügen.
Übersicht über Abfrageausdrücke
- Abfrageausdrücke führen Abfragen durch und transformieren Daten aus einer LINQ-fähigen Datenquelle. Beispielsweise kann eine einzelne Abfrage Daten aus einer SQL-Datenbank abrufen und einen XML-Datenstrom als Ausgabe erzeugen.
- Abfrageausdrücke verwenden viele vertraute C#-Sprachkonstrukte, was sie leicht lesbar macht.
- Die Variablen in einem Abfrageausdruck sind alle stark typiert.
- Eine Abfrage wird erst dann ausgeführt, wenn Sie die Abfragevariable durch Iteration verarbeiten, z. B. in einer
foreach
Anweisung. - Zur Kompilierungszeit werden Abfrageausdrücke gemäß den in der C#-Spezifikation definierten Regeln in Standardmäßige Abfrageoperatormethodenaufrufe konvertiert. Jede Abfrage, die mithilfe der Abfragesyntax ausgedrückt werden kann, kann auch mithilfe der Methodensyntax ausgedrückt werden. In einigen Fällen ist die Abfragesyntax besser lesbar und präziser. In anderen Ist die Methodensyntax besser lesbar. Es gibt keinen Semantik- oder Leistungsunterschied zwischen den beiden verschiedenen Formularen. Weitere Informationen finden Sie unter C#-Sprachspezifikation und Übersicht über Standardabfrageoperatoren.
- Einige Abfragevorgänge, wie Count oder Max, verfügen über keine entsprechende Abfrageausdrucksklausel und müssen daher als Methodenaufruf dargestellt werden. Methodensyntax kann auf verschiedene Weise mit der Abfragesyntax kombiniert werden.
- Abfrageausdrücke können in Ausdrucksbaumstrukturen oder Delegaten kompiliert werden, je nachdem, auf welchen Typ die Abfrage angewendet wird. IEnumerable<T>-Abfragen werden zu Delegaten kompiliert. IQueryable- und IQueryable<T>-Abfragen werden in Ausdrucksbäume kompiliert. Weitere Informationen finden Sie unter Expressionsbäume.
So aktivieren Sie die LINQ-Abfrage Ihrer Datenquelle
In-Memory-Daten
Es gibt zwei Möglichkeiten, LINQ-Abfragen von In-Memory-Daten zu aktivieren. Wenn es sich bei den Daten um einen Typ handelt, der IEnumerable<T> implementiert, können Sie die Daten mithilfe von LINQ to Objects abfragen. Wenn es nicht sinnvoll ist, die Enumeration durch Implementieren der IEnumerable<T> Schnittstelle zu aktivieren, definieren Sie LINQ-Standardabfrageoperatormethoden entweder in diesem Typ oder als Erweiterungsmethoden für diesen Typ. Benutzerdefinierte Implementierungen der Standardabfrageoperatoren sollten die verzögerte Ausführung verwenden, um die Ergebnisse zurückzugeben.
Daten aus der Ferne
Die beste Option zum Aktivieren der LINQ-Abfrage einer Remotedatenquelle besteht darin, die IQueryable<T> Schnittstelle zu implementieren.
IQueryable LINQ-Anbieter
LINQ-Anbieter, die implementieren IQueryable<T> , können in ihrer Komplexität stark variieren.
Ein weniger komplexer IQueryable
Anbieter kann von einem Webdienst aus auf eine einzelne Methode zugreifen. Dieser Anbietertyp ist sehr spezifisch, da er bestimmte Informationen in den von ihr verarbeiteten Abfragen erwartet. Es verfügt über ein geschlossenes Typsystem, das möglicherweise einen einzelnen Ergebnistyp verfügbar macht. Der Großteil der Ausführung der Abfrage erfolgt lokal, z. B. mithilfe Enumerable der Implementierungen der Standardabfrageoperatoren. Ein weniger komplexer Anbieter untersucht möglicherweise nur einen Methodenaufrufausdruck in der Ausdrucksstruktur, die die Abfrage darstellt, und lässt die verbleibende Logik der Abfrage an anderer Stelle behandelt werden.
Ein IQueryable
Anbieter mittlerer Komplexität kann auf eine Datenquelle abzielen, die eine teilweise ausdrucksstarke Abfragesprache aufweist. Wenn er auf einen Webdienst ausgerichtet ist, kann er auf mehrere Methoden des Webdiensts zugreifen und auswählen, welche Methode basierend auf den von der Abfrage gesuchten Informationen aufgerufen werden soll. Ein Anbieter mittlerer Komplexität hätte ein umfangreicheres Typsystem als ein einfacher Anbieter, aber es wäre immer noch ein Festes Typsystem. Der Anbieter kann beispielsweise Typen verfügbar machen, die über 1:n-Beziehungen verfügen, die wiederum traversiert werden können, ohne eine Zuordnungstechnologie für benutzerdefinierte Typen bereitzustellen.
Ein komplexer IQueryable
Anbieter, z. B. der Entity Framework Core-Anbieter , kann vollständige LINQ-Abfragen in eine ausdrucksstarke Abfragesprache wie SQL übersetzen. Ein komplexer Anbieter ist allgemeiner, da er eine breitere Palette von Fragen in der Abfrage verarbeiten kann. Es verfügt auch über ein offenes Typsystem und muss daher umfangreiche Infrastruktur enthalten, um benutzerdefinierte Typen zuzuordnen. Die Entwicklung eines komplexen Anbieters erfordert einen erheblichen Aufwand.