LINQ to EntitiesLINQ to Entities

LINQ to Entities bietet LINQ (Language Integrated Query)-Unterstützung, die es Entwicklern ermöglicht, in Visual Basic oder Visual C# Abfragen für das konzeptionelle Modell im Entity Framework zu schreiben.LINQ to Entities provides Language-Integrated Query (LINQ) support that enables developers to write queries against the Entity Framework conceptual model using Visual Basic or Visual C#. Abfragen für das Entity Framework werden als Befehlsstrukturabfragen dargestellt, die für den Objektkontext ausgeführt werden.Queries against the Entity Framework are represented by command tree queries, which execute against the object context. LINQ to Entities wandelt LINQ (Language-Integrated Queries)-Abfragen in Befehlsstrukturabfragen um, 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.LINQ to Entities converts Language-Integrated Queries (LINQ) queries to command tree queries, executes the queries against the Entity Framework, and returns objects that can be used by both the Entity Framework and LINQ. Mit folgendem Vorgang können Sie eine LINQ to Entities-Abfrage erstellen und ausführen:The following is the process for creating and executing a LINQ to Entities query:

  1. Erstellen Sie eine ObjectQuery<T>-Instanz aus dem ObjectContext.Construct an ObjectQuery<T> instance from ObjectContext.

  2. Verfassen Sie mithilfe der ObjectQuery<T>-Instanz eine LINQ to Entities-Abfrage in C# oder Visual Basic.Compose a LINQ to Entities query in C# or Visual Basic by using the ObjectQuery<T> instance.

  3. Wandeln Sie LINQ-Standardabfrageoperatoren und -ausdrücke in Befehlsstrukturen um.Convert LINQ standard query operators and expressions to command trees.

  4. Führen Sie die als Befehlsstruktur dargestellte Abfrage für die Datenquelle aus.Execute the query, in command tree representation, against the data source. Alle Ausnahmen, die bei der Ausführung für die Datenquelle ausgelöst wurden, werden direkt an den Client weitergegeben.Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. Geben Sie die Abfrageergebnisse an den Client zurück.Return query results back to the client.

Erstellen einer 'ObjectQuery'-InstanzConstructing an ObjectQuery Instance

Die generische ObjectQuery<T>-Klasse stellt eine Abfrage dar, die eine Auflistung von 0 (null) oder mehr typisierten Entitäten zurückgibt.The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. Eine Objektabfrage wird normalerweise aus einem bestehenden Objektkontext und nicht manuell erstellt. Sie gehört immer zu diesem Objektkontext.An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. Dieser Kontext stellt die Verbindungs- und Metadateninformationen bereit, die zum Verfassen und Ausführen der Abfrage erforderlich sind.This context provides the connection and metadata information that is required to compose and execute the query. Die generische ObjectQuery<T>-Klasse implementiert die generische IQueryable<T>-Schnittstelle, durch deren Generatormethoden die inkrementelle Erstellung von LINQ-Abfragen aktiviert wird.The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. Sie können auch den Typ von Entitäten mit dem var-Schlüsselwort in C# (Dim in Visual Basic, wobei der lokale Typrückschluss aktiviert sein muss) per Rückschluss vom Compiler ableiten lassen.You can also let the compiler infer the type of entities by using the C# var keyword (Dim in Visual Basic, with local type inference enabled).

Verfassen der AbfragenComposing the Queries

Instanzen der generischen ObjectQuery<T>-Klasse, die die generische IQueryable<T>-Schnittstelle implementiert, dienen als Datenquelle für LINQ to Entities-Abfragen.Instances of the ObjectQuery<T> generic class, which implements the generic IQueryable<T> interface, serve as the data source for LINQ to Entities queries. In einer Abfrage geben Sie genau die Informationen an, die aus der Datenquelle abgerufen werden sollen.In a query, you specify exactly the information that you want to retrieve from the data source. In der Abfrage kann auch angegeben werden, wie die Abfrageergebnisse sortiert, gruppiert und formatiert werden sollen, bevor sie zurückgegeben werden.A query can also specify how that information should be sorted, grouped, and shaped before it is returned. In LINQ wird eine Abfrage in einer Variablen gespeichert.In LINQ, a query is stored in a variable. Diese Abfragevariable führt keine Aktion aus und gibt keine Daten zurück. Sie dient lediglich zur Speicherung der Abfrageinformationen.This query variable takes no action and returns no data; it only stores the query information. Nachdem Sie eine Abfrage erstellt haben, müssen Sie sie ausführen, damit Daten abgerufen werden.After you create a query you must execute that query to retrieve any data.

LINQ to Entities-Abfragen können in zwei verschiedenen Syntaxarten verfasst werden: in der Abfrageausdrucksyntax und in der methodenbasierten Abfragesyntax.LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. Die Abfrageausdruckssyntax und die methodenbasierte Abfragesyntax sind neu in C# 3.0 und Visual Basic 9.0.Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

Weitere Informationen finden Sie unter Abfragen in LINQ to Entities.For more information, see Queries in LINQ to Entities.

Konvertieren von AbfragenQuery Conversion

Um eine LINQ to Entities-Abfrage für das Entity Framework auszuführen, muss die LINQ-Abfrage in eine Befehlsstrukturdarstellung umgewandelt werden, die für das Entity Framework ausgeführt werden kann.To execute a LINQ to Entities query against the Entity Framework, the LINQ query must be converted to a command tree representation that can be executed against the Entity Framework.

LINQ to Entities-Abfragen bestehen aus LINQ-Standardabfrageoperatoren (wie z. B. Select, Where, und GroupBy) sowie Ausdrücken (x > 10, Contact.LastName usw.).LINQ to Entities queries are comprised of LINQ standard query operators (such as Select, Where, and GroupBy) and expressions (x > 10, Contact.LastName, and so on). LINQ-Operatoren werden nicht von einer Klasse definiert, sondern sind Methoden für eine Klasse.LINQ operators are not defined by a class, but rather are methods on a class. In LINQ können Ausdrücke alles enthalten, was für Typen im System.Linq.Expressions-Namespace zulässig ist, und durch Erweiterung alles, was als Lambda-Funktion dargestellt werden kann.In LINQ, expressions can contain anything allowed by types within the System.Linq.Expressions namespace and, by extension, anything that can be represented in a lambda function. Damit sind sie den Ausdrücken übergeordnet, die im Entity Framework verwendet werden können. Diese sind per Definition auf Operationen beschränkt, die auf der Datenbank zulässig sind und von ObjectQuery<T> unterstützt werden.This is a superset of the expressions that are allowed by the Entity Framework, which are by definition restricted to operations allowed on the database, and supported by ObjectQuery<T>.

Im Entity Framework werden sowohl Operatoren als auch Ausdrücke in einer einzigen Typhierarchie dargestellt, die anschließend in die Befehlsstruktur eingefügt wird.In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. Mithilfe der Befehlsstruktur führt das Entity Framework die Abfrage aus.The command tree is used by the Entity Framework to execute the query. Wenn die LINQ-Abfrage nicht als Befehlsstruktur ausgedrückt werden kann, wird beim Konvertieren der Abfrage eine Ausnahme ausgelöst.If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. Zur Konvertierung von LINQ to Entities-Abfragen gehören die folgenden zwei untergeordneten Konvertierungen: die Umwandlung der Standardabfrageoperatoren und die Konvertierung der Ausdrücke.The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

Für eine Reihe von LINQ-Standardabfrageoperatoren gibt es keine gültige Übersetzung in LINQ to Entities.There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. Die Verwendung dieser Operatoren löst bei der Übersetzung der Abfrage eine Ausnahme aus.Attempts to use these operators will result in an exception at query translation time. Eine Liste der unterstützten LINQ to Entities-Operatoren, finden Sie unter unterstützte und nicht unterstützte LINQ-Methoden (LINQ to Entities).For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

Weitere Informationen zur Verwendung der Standardabfrageoperatoren in LINQ to Entities finden Sie unter Standardabfrageoperatoren in LINQ to Entities-Abfragen.For more information about using the standard query operators in LINQ to Entities, see Standard Query Operators in LINQ to Entities Queries.

Im Allgemeinen werden Ausdrücke in LINQ to Entities auf dem Server ausgewertet, daher dürfte sich das Verhalten der Ausdrücke nicht nach der CLR-Semantik richten.In general, expressions in LINQ to Entities are evaluated on the server, so the behavior of the expression should not be expected to follow CLR semantics. Weitere Informationen finden Sie unter Ausdrücke in LINQ to Entities-Abfragen.For more information, see Expressions in LINQ to Entities Queries.

Informationen, wie CLR-Methodenaufrufe kanonischen Funktionen in der Datenquelle zugeordnet werden, finden Sie unter CLR-Methoden zu kanonischen Funktionszuordnung.For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

Informationen zu Datenbank zum Aufrufen von kanonischen und benutzerdefinierten Funktionen aus LINQ to EntitiesLINQ to Entities Abfragen finden Sie aufrufende Funktionen in LINQ to Entities-Abfragen.For information about how to call canonical, database, and custom functions from within LINQ to EntitiesLINQ to Entities queries, see Calling Functions in LINQ to Entities Queries.

AbfrageausführungQuery Execution

Nachdem der Benutzer die LINQ-Abfrage erstellt hat, wird sie in eine Darstellung konvertiert, die mit dem Entity Framework kompatibel ist (in Form von Befehlsstrukturen). Diese wird anschließend für die Datenquelle ausgeführt.After the LINQ query is created by the user, it is converted to a representation that is compatible with the Entity Framework (in the form of command trees), which is then executed against the data source. Bei der Abfrageausführung werden alle Abfrageausdrücke (oder Abfragekomponenten) auf dem Client oder dem Server ausgewertet.At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. Dazu gehören Ausdrücke, die zur Materialisierung der Ergebnisse oder zur Entitätsprojektion verwendet werden.This includes expressions that are used in result materialization or entity projections. Weitere Informationen finden Sie unter Abfrageausführung.For more information, see Query Execution. Weitere Informationen zur Verbesserung der Leistung durch eine Abfrage einmal kompiliert, und klicken Sie dann mehrfach mit verschiedenen Parametern ausgeführt wird, finden Sie unter kompilierte Abfragen (LINQ to Entities).For information on how to improve performance by compiling a query once and then executing it several times with different parameters, see Compiled Queries (LINQ to Entities).

MaterialisierungMaterialization

Als Materialisierung wird das Zurückgeben von Abfrageergebnissen in Form von CLR-Typen an den Client bezeichnet.Materialization is the process of returning query results back to the client as CLR types. In LINQ to Entities werden Datensätze mit Abfrageergebnissen nie zurückgegeben. Es ist immer ein Sicherungs-CLR-Typ vorhanden, der vom Benutzer oder vom Entity Framework definiert oder vom Compiler generiert wird (anonyme Typen).In LINQ to Entities, query results data records are never returned; there is always a backing CLR type, defined by the user or by the Entity Framework, or generated by the compiler (anonymous types). Jede Objektmaterialisierung wird vom Entity Framework durchgeführt.All object materialization is performed by the Entity Framework. Alle Fehler, die dadurch entstehen, dass zwischen dem Entity Framework und der CLR keine Zuordnung vorgenommen werden kann, lösen bei der Objektmaterialisierung Ausnahmen aus.Any errors that result from an inability to map between the Entity Framework and the CLR will cause exceptions to be thrown during object materialization.

Abfrageergebnisse werden üblicherweise auf eine der folgenden Arten zurückgegeben:Query results are usually returned as one of the following:

  • Eine Auflistung von 0 (null) oder mehr typisierten Entitätsobjekten oder eine Projektion komplexer Typen, die im konzeptionellen Modell definiert werden.A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • CLR-Typen, die vom Entity FrameworkEntity Framework unterstützt werden.CLR types that are supported by the Entity FrameworkEntity Framework.

  • InlineauflistungenInline collections.

  • Anonyme TypenAnonymous types.

Weitere Informationen finden Sie unter Abfrageergebnisse.For more information, see Query Results.

In diesem AbschnittIn This Section

Abfragen in LINQ to EntitiesQueries in LINQ to Entities

Ausdrücke in LINQ to Entities-AbfragenExpressions in LINQ to Entities Queries

Aufrufen von Funktionen in LINQ to Entities-AbfragenCalling Functions in LINQ to Entities Queries

Kompilierte Abfragen (LINQ to Entities)Compiled Queries (LINQ to Entities)

AbfrageausführungQuery Execution

AbfrageergebnisseQuery Results

Standardabfrageoperatoren in LINQ to Entities-AbfragenStandard Query Operators in LINQ to Entities Queries

Zuordnen von CLR-Methoden zu kanonischen FunktionenCLR Method to Canonical Function Mapping

Unterstützte und nicht unterstützte LINQ-Methoden (LINQ to Entities)Supported and Unsupported LINQ Methods (LINQ to Entities)

Bekannte Probleme von und Überlegungen zu LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities

Siehe auchSee also