LINQ to Entities は、Visual Basic または Visual C# を使用して Entity Framework 概念モデルに対してクエリを記述できるようにする、Language-Integrated クエリ (LINQ) のサポートを提供します。 Entity Framework に対するクエリは、オブジェクト コンテキストに対して実行されるコマンド ツリー クエリによって表されます。 LINQ to Entities は、Language-Integrated クエリ (LINQ) クエリをコマンド ツリー クエリに変換し、Entity Framework に対してクエリを実行し、Entity Framework と LINQ の両方で使用できるオブジェクトを返します。 LINQ to Entities クエリを作成して実行するプロセスを次に示します。
ObjectQuery<T>からObjectContext インスタンスを構築します。
ObjectQuery<T> インスタンスを使用して、C# または Visual Basic で LINQ to Entities クエリを作成します。
LINQ 標準クエリ演算子と式をコマンド ツリーに変換します。
データ ソースに対して、コマンド ツリー表現でクエリを実行します。 実行中にデータ ソースに対してスローされた例外は、クライアントに直接渡されます。
クエリ結果をクライアントに返します。
ObjectQuery インスタンスの構築
ObjectQuery<T>ジェネリック クラスは、0 個以上の型指定されたエンティティのコレクションを返すクエリを表します。 オブジェクト クエリは通常、手動で構築されるのではなく、既存のオブジェクト コンテキストから構築され、常にそのオブジェクト コンテキストに属します。 このコンテキストは、クエリの作成と実行に必要な接続とメタデータ情報を提供します。
ObjectQuery<T> ジェネリック クラスは、linq クエリを段階的に構築できるようにするビルダー メソッドを持つIQueryable<T>ジェネリック インターフェイスを実装します。 C# var キーワード (Visual Basic ではローカル型推論が有効になっているDim ) を使用して、コンパイラがエンティティの型を推論することもできます。
クエリの作成
ジェネリック ObjectQuery<T> インターフェイスを実装する IQueryable<T> ジェネリック クラスのインスタンスは、LINQ to Entities クエリのデータ ソースとして機能します。 クエリでは、データ ソースから取得する情報を正確に指定します。 クエリでは、情報を返す前に並べ替え、グループ化、および整形する方法を指定することもできます。 LINQ では、クエリは変数に格納されます。 このクエリ変数はアクションを実行せず、データを返しません。クエリ情報のみが格納されます。 クエリを作成したら、そのクエリを実行してデータを取得する必要があります。
LINQ to Entities クエリは、クエリ式構文とメソッドベースのクエリ構文という 2 つの異なる構文で構成できます。 クエリ式の構文とメソッドベースのクエリ構文は、C# 3.0 および Visual Basic 9.0 の新機能です。
詳細については、「 LINQ to Entities のクエリ」を参照してください。
クエリ変換
Entity Framework に対して LINQ to Entities クエリを実行するには、ENTITY Framework に対して実行できるコマンド ツリー表現に LINQ クエリを変換する必要があります。
LINQ to Entities クエリは、LINQ 標準クエリ演算子 ( Select、 Where、 GroupByなど) と式 (x > 10、Contact.LastName など) で構成されます。 LINQ 演算子はクラスによって定義されるのではなく、クラスのメソッドです。 LINQ では、式には、 System.Linq.Expressions 名前空間内の型で許可されるもの、およびラムダ関数で表すことができるもののうち、何でも含めることができます。 これは Entity Framework で許可される式のスーパーセットであり、定義上はデータベースで許可される操作に制限され、 ObjectQuery<T>でサポートされます。
Entity Framework では、演算子と式の両方が単一の型階層で表され、コマンド ツリーに配置されます。 コマンド ツリーは、クエリを実行するために Entity Framework によって使用されます。 LINQ クエリをコマンド ツリーとして表現できない場合は、クエリの変換時に例外がスローされます。 LINQ から Entities クエリへの変換には、標準クエリ演算子の変換と式の変換という 2 つのサブ変換が含まれます。
LINQ to Entities には有効な変換がない LINQ 標準クエリ演算子が多数あります。 これらの演算子を使用しようとすると、クエリ変換時に例外が発生します。 サポートされている LINQ to Entities 演算子の一覧については、「 サポートされている LINQ メソッドとサポートされていない LINQ メソッド (LINQ to Entities)」を参照してください。
LINQ to Entities で標準クエリ演算子を使用する方法の詳細については、「LINQ to Entities クエリ の標準クエリ演算子」を参照してください。
一般に、LINQ to Entities の式はサーバー上で評価されるため、式の動作が CLR セマンティクスに従う必要はありません。 詳細については、「 LINQ to Entities クエリの式」を参照してください。
CLR メソッド呼び出しをデータ ソースの正規関数にマップする方法については、「 CLR メソッドから正規関数へのマッピング」を参照してください。
LINQ to Entities クエリ内から正規関数、データベース関数、およびカスタム関数を呼び出す方法については、「LINQ to Entities クエリでの関数の呼び出し」を参照してください。
クエリの実行
LINQ クエリは、ユーザーによって作成された後、Entity Framework (コマンド ツリーの形式) と互換性のある表現に変換され、データ ソースに対して実行されます。 クエリの実行時に、すべてのクエリ式 (またはクエリのコンポーネント) がクライアントまたはサーバーで評価されます。 これには、結果の具体化またはエンティティプロジェクションで使用される式が含まれます。 詳細については、「 クエリの実行」を参照してください。 クエリを 1 回コンパイルし、異なるパラメーターで複数回実行することでパフォーマンスを向上させる方法については、「 コンパイル済みクエリ (LINQ to Entities)」を参照してください。
具体化
具体化とは、クエリ結果を CLR 型としてクライアントに返すプロセスです。 LINQ to Entities では、クエリ結果のデータ レコードは返されません。バッキング CLR 型は常に存在し、ユーザーまたは Entity Framework によって定義されるか、コンパイラによって生成されます (匿名型)。 すべてのオブジェクトの具体化は、Entity Framework によって実行されます。 Entity Framework と CLR とのマッピングができないことが原因でエラーが発生すると、オブジェクトの具体化中に例外がスローされます。
通常、クエリ結果は次のいずれかとして返されます。
0 個以上の型指定されたエンティティ オブジェクトのコレクション、または概念モデルで定義されている複合型のプロジェクション。
Entity Framework でサポートされている CLR 型。
インライン コレクション。
匿名型。
詳細については、「 クエリ結果」を参照してください。
このセクションの内容
LINQ to Entities におけるクエリ
サポートされている LINQ メソッドとサポートされていない LINQ メソッド (LINQ to Entities)