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. Sie schreiben Abfrageausdrücke in einer deklarativen Abfragesyntax. 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 untersuchen 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
foreachAnweisung. - Zur Kompilierzeit konvertiert der Compiler Abfrageausdrücke zu Standardabfrageoperator-Methodenaufrufen gemäß den in der C#-Spezifikation definierten Regeln. Sie können jede Abfrage ausdrücken, die die Abfragesyntax verwendet, mithilfe der Methodensyntax. 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 z. B. Count oder Max, haben keine entsprechende Abfrageausdruckklausel und müssen als Methodenaufrufe ausgedrückt werden. Sie können methodensyntax mit abfragesyntax auf unterschiedliche Weise kombinieren.
- Abfrageausdrücke können in Ausdrucksbaumstrukturen oder Delegaten kompiliert werden, je nachdem, auf welchen Typ die Abfrage angewendet wird. Der Compiler kompiliert IEnumerable<T> Abfragen zu Delegates. Der Compiler kompiliert IQueryable- und IQueryable<T>-Abfragen in Ausdrucksbäume. Weitere Informationen finden Sie unter Expressionsbäume.
So aktivieren Sie die LINQ-Abfrage Ihrer Datenquelle
In-Memory-Daten
Sie können LINQ-Abfragen von Speicherdaten auf zwei Arten aktivieren. Wenn die Daten von einem Typ sind, 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 Erweiterungsmitglied 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 spezifisch für die Datenquelle, 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, der die Abfrage darstellt, und lässt die verbleibende Logik der Abfrage an anderer Stelle verarbeitet 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 verfügt über ein umfangreicheres Typsystem als ein einfacher Anbieter, aber es ist immer noch ein festes Typsystem. Beispielsweise kann ein Anbieter Typen verfügbar machen, die 1:n-Beziehungen aufweisen, die durchlaufen werden können, stellt jedoch keine Zuordnungstechnologie für benutzerdefinierte Typen bereit.
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.