Freigeben über


LINQ to Entities (LINQ für Entitäten)

LINQ to Entities stellt Language-Integrated Query (LINQ)-Unterstützung bereit, mit der Entwickler Abfragen für das konzeptionelle Modell von Entity Framework mit Visual Basic oder Visual C# schreiben können. Abfragen für das Entity Framework werden durch Befehlsstrukturabfragen dargestellt, die für den Objektkontext ausgeführt werden. LINQ to Entities konvertiert Language-Integrated Queries (LINQ)-Abfragen in Befehlsstrukturabfragen, führt die Abfragen für das Entity Framework aus und gibt Objekte zurück, die sowohl vom Entity Framework als auch von LINQ verwendet werden können. Es folgt der Prozess zum Erstellen und Ausführen einer LINQ to Entities-Abfrage:

  1. Erstellen einer ObjectQuery<T> Instanz aus ObjectContext.

  2. Verfassen Sie eine LINQ to Entities-Abfrage in C# oder Visual Basic mithilfe der ObjectQuery<T> Instanz.

  3. Wandeln Sie LINQ-Standardabfrageoperatoren und -ausdrücke in Befehlsstrukturen um.

  4. Führen Sie die als Befehlsstruktur dargestellte Abfrage für die Datenquelle aus. Alle Ausnahmen, die während der Ausführung auf der Datenquelle ausgelöst werden, werden direkt an den Client übergeben.

  5. Zurückgeben von Abfrageergebnissen zurück an den Client.

Erstellen einer ObjectQuery-Instanz

Die ObjectQuery<T> generische Klasse stellt eine Abfrage dar, die eine Auflistung von null oder mehr typierten Entitäten zurückgibt. Eine Objektabfrage wird in der Regel aus einem vorhandenen Objektkontext erstellt, anstatt manuell erstellt zu werden und gehört immer zu diesem Objektkontext. Dieser Kontext stellt die Verbindungs- und Metadateninformationen bereit, die zum Verfassen und Ausführen der Abfrage erforderlich sind. Die ObjectQuery<T> generische Klasse implementiert die IQueryable<T> generische Schnittstelle, deren Generatormethoden LINQ-Abfragen inkrementell erstellen können. Sie können auch zulassen, dass der Compiler den Typ der Entitäten ableiten kann, indem Sie das C# var -Schlüsselwort (Dim in Visual Basic, mit aktivierter lokaler Typinference) verwenden.

Verfassen der Abfragen

Instanzen der ObjectQuery<T> generischen Klasse, die die generische IQueryable<T> Schnittstelle implementiert, dienen als Datenquelle für LINQ to Entities-Abfragen. In einer Abfrage geben Sie genau die Informationen an, die Sie aus der Datenquelle abrufen möchten. Eine Abfrage kann auch angeben, wie diese Informationen sortiert, gruppiert und geformt werden sollen, bevor sie zurückgegeben wird. In LINQ wird eine Abfrage in einer Variablen gespeichert. Diese Abfragevariable führt keine Aktion aus und gibt keine Daten zurück. es speichert nur die Abfrageinformationen. Nachdem Sie eine Abfrage erstellt haben, müssen Sie diese Abfrage ausführen, um daten abzurufen.

LINQ to Entities-Abfragen können in zwei verschiedenen Syntaxen zusammengesetzt werden: Abfrageausdruckssyntax und methodenbasierte Abfragesyntax. Abfrageausdruckssyntax und methodenbasierte Abfragesyntax sind neu in C# 3.0 und Visual Basic 9.0.

Weitere Informationen finden Sie unter Abfragen in LINQ to Entities.

Konvertieren von Abfragen

Um eine LINQ to Entities-Abfrage für das Entity Framework auszuführen, muss die LINQ-Abfrage in eine Befehlsstrukturdarstellung konvertiert werden, die für das Entity Framework ausgeführt werden kann.

LINQ to Entities-Abfragen bestehen aus LINQ-Standardabfrageoperatoren (wie Select, Where und GroupBy) und Ausdrücken (x > 10, Contact.LastName und so weiter). LINQ-Operatoren werden nicht durch eine Klasse definiert, sondern sind Methoden für eine Klasse. In LINQ können Ausdrücke alles enthalten, was von Typen innerhalb des System.Linq.Expressions Namespaces zulässig ist, und durch Erweiterung alles, was in einer Lambda-Funktion dargestellt werden kann. Dies ist eine Obermenge der Ausdrücke, die vom Entity Framework zugelassen sind und per Definition auf Vorgänge beschränkt sind, welche in der Datenbank zulässig und von ObjectQuery<T> unterstützt werden.

Im Entity Framework werden sowohl Operatoren als auch Ausdrücke durch eine einzelne Typhierarchie dargestellt, die dann in einer Befehlsstruktur platziert werden. Die Befehlsstruktur wird vom Entity Framework zum Ausführen der Abfrage verwendet. Wenn die LINQ-Abfrage nicht als Befehlsstruktur ausgedrückt werden kann, wird eine Ausnahme ausgelöst, wenn die Abfrage konvertiert wird. Die Konvertierung von LINQ in Entities-Abfragen umfasst zwei Unterkonvertierungen: die Konvertierung der Standardabfrageoperatoren und die Konvertierung der Ausdrücke.

Es gibt eine Reihe von LINQ-Standardabfrageoperatoren, die keine gültige Übersetzung in LINQ to Entities haben. Die Verwendung dieser Operatoren löst bei der Übersetzung der Abfrage eine Ausnahme aus. Eine Liste der unterstützten LINQ to Entities-Operatoren finden Sie unter Unterstützte und nicht unterstützte LINQ-Methoden (LINQ to Entities).

Weitere Informationen zur Verwendung der Standardabfrageoperatoren in LINQ to Entities finden Sie unter Standardabfrageoperatoren in LINQ to Entities Queries.

Im Allgemeinen werden Ausdrücke in LINQ to Entities auf dem Server ausgewertet, sodass das Verhalten des Ausdrucks nicht der CLR-Semantik folgen sollte. Weitere Informationen finden Sie unter Ausdrücke in LINQ to Entities Queries.

Informationen dazu, wie CLR-Methodenaufrufe kanonischen Funktionen in der Datenquelle zugeordnet werden, finden Sie unter CLR-Methode zur kanonischen Funktionszuordnung.

Informationen zum Aufrufen von kanonischen, Datenbank- und benutzerdefinierten Funktionen aus LINQ to Entities-Abfragen finden Sie unter Aufrufen von Funktionen in LINQ to Entities Queries.

Abfrageausführung

Nachdem die LINQ-Abfrage vom Benutzer erstellt wurde, wird sie in eine Darstellung konvertiert, die mit dem Entity Framework (in Form von Befehlsstrukturen) kompatibel ist, die dann für die Datenquelle ausgeführt wird. Zur Abfrageausführung werden alle Abfrageausdrücke (oder Komponenten der Abfrage) auf dem Client oder auf dem Server ausgewertet. Dazu gehören Ausdrücke, die in Ergebnismaterialisierungen oder Entitätsprojektionen verwendet werden. Weitere Informationen finden Sie unter Abfrageausführung. Informationen dazu, wie Sie die Leistung verbessern, indem Sie eine Abfrage einmal kompilieren und diese dann mehrmals mit verschiedenen Parametern ausführen, finden Sie unter "Kompilierte Abfragen" (LINQ to Entities).

Materialisation

Die Materialisierung ist der Prozess der Rückgabe von Abfrageergebnissen als CLR-Typen an den Client. In LINQ to Entities werden Abfrageergebnissedatensätze nie zurückgegeben; es gibt immer einen zugrunde stehenden CLR-Typ, der vom Benutzer oder vom Entity Framework definiert oder vom Compiler (anonyme Typen) generiert wird. Alle Objektmaterialisierungen werden vom Entity Framework ausgeführt. Alle Fehler, die sich aus einer Unfähigkeit zur Zuordnung zwischen Entity Framework und CLR ergeben, führen dazu, dass Ausnahmen während der Objektmaterialisierung ausgelöst werden.

Abfrageergebnisse werden in der Regel als eine der folgenden Zurückgegeben:

  • Eine Auflistung von Null- oder mehr typierten Entitätsobjekten oder eine Projektion komplexer Typen, die im konzeptionellen Modell definiert sind.

  • CLR-Typen, die vom Entity Framework unterstützt werden.

  • Inlineauflistungen

  • Anonyme Typen.

Weitere Informationen finden Sie unter Abfrageergebnisse.

In diesem Abschnitt

Abfragen in LINQ to Entities

Ausdrücke in LINQ to Entities Queries

Aufrufen von Funktionen in LINQ to Entities Queries

Kompilierte Abfragen (LINQ to Entities)

Abfrageausführung

Abfrageergebnisse

Standardabfrageoperatoren in LINQ to Entities Queries

CLR-Methode zur kanonischen Funktionszuordnung

Unterstützte und nicht unterstützte LINQ-Methoden (LINQ to Entities)

Bekannte Probleme und Überlegungen in LINQ to Entities

Siehe auch