LINQ クエリ操作での型の関係 (C#)Type Relationships in LINQ Query Operations (C#)

クエリを効果的に記述するには、クエリ操作全体における変数の型の相互関係を理解する必要があります。To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. これらの関係を理解しておくと、このドキュメント内の LINQLINQ のサンプルやコード例を理解しやすくなります。If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. また、var を使用して変数を暗黙的に型指定した場合に、背後でどのような処理が行われるかを理解することもできます。Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

LINQLINQ のクエリ操作は、データ ソース、クエリ自体、およびクエリの実行において厳密に型指定されます。query operations are strongly typed in the data source, in the query itself, and in the query execution. クエリの変数の型には、データ ソース内の要素の型および foreach ステートメントの反復変数の型との互換性が必要です。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. この厳密な型指定により、コンパイル時に型のエラーが検出され、実際にエラーが発生する前にそのエラーを修正できます。This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

これらの型の関係を示すために、後の例の大部分では、すべての変数に明示的な型指定を使用しています。In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. 最後の例では、var を使用して暗黙的な型指定を行う場合でも、同じ基本原則が適用されることを示します。The last example shows how the same principles apply even when you use implicit typing by using var.

ソース データを変換しないクエリQueries that do not Transform the Source Data

次の図は、データの変換を行わない LINQLINQ to Objects クエリ操作を示しています。The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. ソースには文字列のシーケンスが含まれているので、クエリ出力も文字列のシーケンスです。The source contains a sequence of strings and the query output is also a sequence of strings.

LINQ クエリ内のデータ型の関係を示す図。

  1. データ ソースの型引数によって、範囲変数の型が決まります。The type argument of the data source determines the type of the range variable.

  2. 選択したオブジェクトの型によって、クエリ変数の型が決まります。The type of the object that is selected determines the type of the query variable. ここでは、name は文字列です。Here name is a string. したがって、クエリ変数は IEnumerable<string> になります。Therefore, the query variable is an IEnumerable<string>.

  3. クエリ変数は、foreach ステートメントで反復処理されます。The query variable is iterated over in the foreach statement. クエリ変数は文字列のシーケンスなので、反復変数も文字列です。Because the query variable is a sequence of strings, the iteration variable is also a string.

ソース データを変換するクエリQueries that Transform the Source Data

次の図は、単純なデータ変換を行う LINQ to SQLLINQ to SQL クエリ操作を示しています。The following illustration shows a LINQ to SQLLINQ to SQL query operation that performs a simple transformation on the data. このクエリは、Customer オブジェクトのシーケンスを入力として受け取り、Name プロパティのみを結果に選択します。The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Name は文字列なので、クエリは出力として文字列のシーケンスを作成します。Because Name is a string, the query produces a sequence of strings as output.

データ型を変換するクエリを示す図。

  1. データ ソースの型引数によって、範囲変数の型が決まります。The type argument of the data source determines the type of the range variable.

  2. select ステートメントは、完全な Name オブジェクトではなく、Customer プロパティを返します。The select statement returns the Name property instead of the complete Customer object. Name は文字列なので、custNameQuery の型引数は string ではなく Customer になります。Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. custNameQuery は文字列のシーケンスなので、foreach ループの反復変数も string です。Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

次の図は、もう少し複雑な変換を示しています。The following illustration shows a slightly more complex transformation. select ステートメントは、元の Customer オブジェクトのメンバーを 2 つだけ取り込む匿名型を返します。The select statement returns an anonymous type that captures just two members of the original Customer object.

データ型を変換するより複雑なクエリを示す図。

  1. データ ソースの型引数は、常にクエリの範囲変数の型です。The type argument of the data source is always the type of the range variable in the query.

  2. select ステートメントによって匿名型が生成されるため、クエリ変数は var を使用して暗黙的に型指定する必要があります。Because the select statement produces an anonymous type, the query variable must be implicitly typed by using var.

  3. クエリ変数の型が暗黙的なので、foreach ループの反復変数も暗黙的にする必要があります。Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

コンパイラによる型情報の推論Letting the compiler infer type information

クエリ操作における変数の関係を理解することは大切ですが、この処理をコンパイラで自動的に行う方法もあります。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. var キーワードは、クエリ操作の任意のローカル変数に使用できます。The keyword var can be used for any local variable in a query operation. 次の図は、前に説明した例 2 と類似しています。The following illustration is similar to example number 2 that was discussed earlier. ここでは、コンパイラがクエリ操作の各変数について、厳密な型を指定します。However, the compiler supplies the strong type for each variable in the query operation.

暗黙的な入力による型フローを示す図。

var の詳細については、「暗黙的に型指定されたローカル変数」を参照してください。For more information about var, see Implicitly Typed Local Variables.