LINQ to EntitiesLINQ to Entities

LINQ to Entities は、開発者が Visual Basic または Visual C# を使用して Entity Framework 概念モデルに対するクエリを作成するための統合言語クエリ (LINQ) のサポートを提供します。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#. Entity Framework に対するクエリで代表的なものが、コマンド ツリー クエリです。これはオブジェクト コンテキストに対して実行されます。Queries against the Entity Framework are represented by command tree queries, which execute against the object context. LINQ to Entities では、統合言語クエリ (LINQ) クエリをコマンド ツリー クエリに変換し、そのクエリを Entity Framework に対して実行します。返されたオブジェクトは、Entity Framework でも LINQ でも使用できます。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. 次に、LINQ to Entities クエリを作成して実行する手順を示します。The following is the process for creating and executing a LINQ to Entities query:

  1. ObjectQuery<T> から ObjectContext インスタンスを作成します。Construct an ObjectQuery<T> instance from ObjectContext.

  2. ObjectQuery<T> インスタンスを使用して、C# または Visual Basic で LINQ to Entities クエリを作成します。Compose a LINQ to Entities query in C# or Visual Basic by using the ObjectQuery<T> instance.

  3. LINQ 標準クエリ演算子および標準クエリ式をコマンド ツリーに変換します。Convert LINQ standard query operators and expressions to command trees.

  4. コマンド ツリーで表されたクエリをデータ ソースに対して実行します。Execute the query, in command tree representation, against the data source. 実行中にデータ ソースに対してスローされた例外は、クライアントに直接渡されます。Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. クエリの結果をクライアントに返します。Return query results back to the client.

ObjectQuery インスタンスの構築Constructing an ObjectQuery Instance

ObjectQuery<T> ジェネリック クラスは、0 個以上の型指定されたエンティティのコレクションを返すクエリを表します。The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. 通常、オブジェクト クエリは手作業で構築されるのではなく、既存のオブジェクト コンテキストから構築され、常にそのオブジェクト コンテキストに属しています。An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. このコンテキストにより、クエリの作成と実行に必要な接続情報とメタデータ情報が取得されます。This context provides the connection and metadata information that is required to compose and execute the query. ObjectQuery<T> ジェネリック クラスでは、IQueryable<T> ジェネリック インターフェイスが実装されます。このインターフェイスのビルダー メソッドにより、LINQ クエリを段階的に構築できます。The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. C# var キーワード (Visual Basic の場合は Dim、ローカル型推論を有効にする) を使用することで、コンパイラでエンティティの型を推論することもできます。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).

クエリの作成Composing the Queries

ObjectQuery<T> ジェネリック インターフェイスを実装する IQueryable<T> ジェネリック クラスのインスタンスは、LINQ to Entities クエリのデータ ソースとして動作します。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 a query, you specify exactly the information that you want to retrieve from the data source. また、並べ替え、グループ化、整形方法を指定して情報を取得することもできます。A query can also specify how that information should be sorted, grouped, and shaped before it is returned. LINQ では、クエリが変数に格納されます。In LINQ, a query is stored in a variable. このクエリ変数は、クエリの情報を保存するだけで、なんらかのアクションを実行したり、データを返したりすることはありません。This query variable takes no action and returns no data; it only stores the query information. クエリを作成した後、データを取得するには、そのクエリを実行する必要があります。After you create a query you must execute that query to retrieve any data.

LINQ to Entities クエリは、クエリ式の構文とメソッド ベースのクエリ構文という 2 とおりの構文を使って作成できます。LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. クエリ式の構文とメソッド ベースのクエリ構文は、C# 3.0 と Visual Basic 9.0 で新たに導入された機能です。Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

詳細については、次を参照してください。で LINQ to Entities クエリします。For more information, see Queries in LINQ to Entities.

クエリの変換Query Conversion

LINQ to Entities クエリを Entity Framework に対して実行するには、LINQ クエリを Entity Framework に対して実行できるコマンド ツリー表現に変換する必要があります。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 クエリは、LINQ 標準クエリ演算子 (SelectWhereGroupBy など) と式 (x > 10 や Contact.LastName など) で構成されます。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 演算子はクラスで定義されるものではなく、クラスのメソッドです。LINQ operators are not defined by a class, but rather are methods on a class. LINQ の式には、System.Linq.Expressions 名前空間の型で許容される要素だけでなく、ラムダ関数で表される要素であれば何でも使用できます。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. これは Entity Framework で許容される式のスーパーセットです。定義により、このような式はデータベースで許容され、ObjectQuery<T> でサポートされる操作に限定されています。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>.

Entity Framework では、演算子と式は 1 つの型の階層で表された後、コマンド ツリーに配置されます。In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. このコマンド ツリーが、Entity Framework でのクエリの実行に使用されます。The command tree is used by the Entity Framework to execute the query. LINQ クエリをコマンド ツリーとして表現できない場合、クエリの変換中に例外がスローされます。If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. LINQ to Entities クエリを変換する際には、標準クエリ演算子の変換と式の変換という 2 つの変換が実行されます。The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

LINQ to Entities で正しく変換されない LINQ 標準クエリ演算子は多数あります。There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. このような演算子を使用すると、クエリの変換時に例外が発生します。Attempts to use these operators will result in an exception at query translation time. サポートされている LINQ to Entities クエリの一覧は、次を参照してください。サポートされているとサポートされていない LINQ メソッド (LINQ to Entities)します。For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

LINQ to Entities で標準クエリ演算子の使用に関する詳細については、次を参照してください。 LINQ to Entities クエリでの標準クエリ演算子します。For more information about using the standard query operators in LINQ to Entities, see Standard Query Operators in LINQ to Entities Queries.

一般的に、LINQ to Entities の式はサーバー上で評価されるため、式の動作が CLR セマンティクスに従っているとは限りません。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. 詳細については、次を参照してください。 LINQ to Entities クエリ内の式します。For more information, see Expressions in LINQ to Entities Queries.

CLR メソッドの呼び出しをデータ ソースの正規関数にマップする方法については、次を参照してください。 CLR メソッドと正規関数マッピングします。For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

内からカスタム関数と標準的な呼び出し、データベース、する方法についてはLINQ to EntitiesLINQ to Entitiesクエリを参照してくださいLINQ to Entities クエリ内の関数の呼び出しします。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.

クエリの実行Query Execution

ユーザーが LINQ クエリを作成すると、Entity Framework と互換性のある表現 (コマンド ツリーの形) に変換された後、データ ソースに対して実行されます。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. クエリの実行時に、すべてのクエリ式 (またはクエリの構成要素) がクライアントまたはサーバー上で評価されます。At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. これには、結果の具体化やエンティティの投影で使用される式も含まれます。This includes expressions that are used in result materialization or entity projections. 詳細については、次を参照してください。クエリの実行します。For more information, see Query Execution. クエリを 1 回コンパイルしてから、実行する複数回異なるパラメーターを使用してパフォーマンスを向上させる方法については、次を参照してください。コンパイルされたクエリ (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).

具体化Materialization

具体化は、クエリの結果を CLR 型としてクライアントに返すプロセスです。Materialization is the process of returning query results back to the client as CLR types. LINQ to Entities では、クエリの結果のデータ レコードは決して返されません。常に返されるのは、ユーザーまたは Entity Framework で定義された CLR 型、またはコンパイラによって生成される CLR 型 (匿名型) です。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). オブジェクトの具体化は、すべて Entity Framework によって実行されます。All object materialization is performed by the Entity Framework. Entity Framework と CLR とのマッピングができないことが原因でエラーが発生すると、オブジェクトの具体化中に例外がスローされます。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.

通常、クエリの結果は次のいずれかの形で返されます。Query results are usually returned as one of the following:

  • 0 個以上の型指定されたエンティティ オブジェクトのコレクション、または概念モデルで定義されている複合型のプロジェクション。A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • Entity FrameworkEntity Framework でサポートされる CLR 型。CLR types that are supported by the Entity FrameworkEntity Framework.

  • インライン コレクション。Inline collections.

  • 匿名型。Anonymous types.

詳細については、次を参照してください。クエリ結果します。For more information, see Query Results.

このセクションの内容In This Section

LINQ to Entities でのクエリQueries in LINQ to Entities

LINQ to Entities クエリ内の式Expressions in LINQ to Entities Queries

LINQ to Entities クエリ内の関数の呼び出しCalling Functions in LINQ to Entities Queries

コンパイル済みクエリ (LINQ to Entities)Compiled Queries (LINQ to Entities)

クエリの実行Query Execution

クエリ結果Query Results

LINQ to Entities クエリの標準クエリ演算子Standard Query Operators in LINQ to Entities Queries

CLR メソッドと正規関数とのマッピングCLR Method to Canonical Function Mapping

サポート対象の LINQ メソッドとサポート非対象の LINQ メソッド (LINQ to Entities) Supported and Unsupported LINQ Methods (LINQ to Entities)

LINQ to Entities の既知の問題および注意点Known Issues and Considerations in LINQ to Entities

関連項目See Also

LINQ to Entities の既知の問題および注意点Known Issues and Considerations in LINQ to Entities
統合言語クエリ (LINQ)LINQ (Language-Integrated Query)
LINQ と ADO.NETLINQ and ADO.NET
ADO.NET Entity FrameworkADO.NET Entity Framework