Typbeziehungen in LINQ-Abfragevorgängen (C#)Type Relationships in LINQ Query Operations (C#)

Um Abfragen effektiv erstellen zu können, ist es wichtig, dass Sie verstehen, wie die Variablentypen in einer vollständigen Abfrageoperation miteinander zusammenhängen.To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. Wenn Sie diese Beziehungen verstehen, können Sie die LINQLINQ-Beispiele und die Codebeispiele in der Dokumentation besser nachvollziehen.If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. Weiterhin können Sie dann besser verstehen, was im Hintergrund abläuft, wenn Variablen implizit mithilfe von var typisiert werden.Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

LINQLINQ-Abfrageoperationen sind in der Datenquelle, in der Abfrage selbst und in der Abfrageausführung stark typisiert. query operations are strongly typed in the data source, in the query itself, and in the query execution. Die Variablentypen in der Abfrage müssen mit den Elementtypen in der Datenquelle und mit dem Typ der Iterationsvariablen in der foreach-Anweisung kompatibel sein.The type of the variables in the query must be compatible with the type of the elements in the data source and with the type of the iteration variable in the foreach statement. Diese starke Typisierung stellt sicher, dass Typfehler zur Kompilierzeit abgefangen werden, sodass sie korrigiert werden können, bevor die Benutzer sie ausführen.This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

Um diese Typbeziehungen zu veranschaulichen, wird in den meisten folgenden Beispielen explizite Typisierung für alle Variablen angewendet.In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. Im letzten Beispiel wird gezeigt, wie diese Prinzipien auch dann gelten, wenn Sie die implizite Typisierung mithilfe von var verwenden.The last example shows how the same principles apply even when you use implicit typing by using var.

Abfragen, bei denen die Quelldaten nicht transformiert werdenQueries that do not Transform the Source Data

Die folgende Abbildung zeigt eine LINQLINQ-Abfrageoperation für Objekte, die keine Transformationen der Daten ausführt.The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. Die Quelle enthält eine Sequenz von Zeichenfolgen, und die Abfrageausgabe ist ebenfalls eine Sequenz von Zeichenfolgen.The source contains a sequence of strings and the query output is also a sequence of strings.

Beziehung von Datentypen in einer LINQ-AbfrageRelation of data types in a LINQ query

  1. Das Typargument der Datenquelle bestimmt den Typ der Bereichsvariablen.The type argument of the data source determines the type of the range variable.

  2. Der Typ des Objekts, das ausgewählt ist, bestimmt den Typ der Abfragevariablen.The type of the object that is selected determines the type of the query variable. In diesem Beispiel ist name eine Zeichenfolge.Here name is a string. Daher ist die Abfragevariable eine IEnumerable<Zeichenfolge>.Therefore, the query variable is an IEnumerable<string>.

  3. Die Abfragevariable durchläuft in der foreach-Anweisung verschiedene Iterationen.The query variable is iterated over in the foreach statement. Da die Abfragevariable eine Sequenz von Zeichenfolgen ist, ist die Iterationsvariable ebenfalls eine Zeichenfolge.Because the query variable is a sequence of strings, the iteration variable is also a string.

Abfragen, bei denen die Quelldaten transformiert werdenQueries that Transform the Source Data

Die folgende Abbildung zeigt eine LINQ to SQLLINQ to SQL-Abfrageoperation, die eine einfache Datentransformation ausführt.The following illustration shows a LINQ to SQLLINQ to SQL query operation that performs a simple transformation on the data. Die Abfrage verwendet eine Sequenz von Customer-Objekten als Eingabe und wählt nur die Name-Eigenschaft im Ergebnis aus.The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Da Name eine Zeichenfolge ist, erzeugt die Abfrage eine Sequenz von Zeichenfolgen als Ausgabe.Because Name is a string, the query produces a sequence of strings as output.

Eine Abfrage, die den Datentyp transformiertA query that transforms the data type

  1. Das Typargument der Datenquelle bestimmt den Typ der Bereichsvariablen.The type argument of the data source determines the type of the range variable.

  2. Die select-Anweisung gibt die Name-Eigenschaft statt des vollständigen Customer-Objekts zurück.The select statement returns the Name property instead of the complete Customer object. Da Name eine Zeichenfolge ist, lautet das Typargument von custNameQuery nicht string, sondern Customer.Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. Da custNameQuery eine Sequenz von Zeichenfolgen ist, muss die Iterationsvariable der foreach-Schleife auch ein string sein.Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

Die folgende Abbildung zeigt eine etwas komplexere Transformation.The following illustration shows a slightly more complex transformation. Die select-Anweisung gibt einen anonymen Typ zurück, der nur zwei Member des ursprünglichen Customer-Objekts erfasst.The select statement returns an anonymous type that captures just two members of the original Customer object.

Eine Abfrage, die den Datentyp transformiertA query that transforms the data type

  1. Das Typargument der Datenquelle ist immer der Typ der Bereichsvariablen in der Abfrage.The type argument of the data source is always the type of the range variable in the query.

  2. Da die select-Anweisung einen anonymen Typ erzeugt, muss die Abfragevariable mithilfe von var implizit typisiert werden.Because the select statement produces an anonymous type, the query variable must be implicitly typed by using var.

  3. Da der Typ der Abfragevariablen implizit ist, muss die Iterationsvariable in der foreach-Schleife auch implizit sein.Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

Ableiten von Typinformationen durch den CompilerLetting the compiler infer type information

Auch wenn Sie die Typbeziehungen einer Abfrageoperation grundsätzlich verstehen sollten, haben Sie die Option, den Compiler alle Arbeitsschritte ausführen zu lassen.Although you should understand the type relationships in a query operation, you have the option to let the compiler do all the work for you. Das var-Schlüsselwort kann in einer Abfrageoperation für jede lokale Variable verwendet werden.The keyword var can be used for any local variable in a query operation. Die folgende Abbildung ähnelt Beispiel Nummer 2, das zuvor erläutert wurde.The following illustration is similar to example number 2 that was discussed earlier. Allerdings stellt der Compiler den starken Typ für jede Variable in der Abfrageoperation bereit.However, the compiler supplies the strong type for each variable in the query operation.

Typfluss mit implizierter TypisierungType flow with implicit typing

Weitere Informationen zu var finden Sie unter Implizit typisierte lokale Variablen.For more information about var, see Implicitly Typed Local Variables.

Siehe auchSee Also

Erste Schritte mit LINQ in C#Getting Started with LINQ in C#