Entity Framework Core では、言語統合クエリ (LINQ) を使用してデータベースのデータを照会します。 LINQ を使用すると、C# (または選択した .NET 言語) を使用して、派生コンテキストとエンティティ クラスに基づいて厳密に型指定されたクエリを記述できます。
注
この記事は古く、クエリ パイプラインの設計で発生した変更を考慮するために、一部の部分を更新する必要があります。 ここで言及されている動作について疑問がある場合は、 質問してください。
クエリの有効期間
次の説明は、各クエリが実行されるプロセスの概要です。
- LINQ クエリは Entity Framework Core によって処理され、データベース プロバイダーによって処理される準備ができている表現を構築します。
- クエリが実行されるたびにこの処理を実行する必要がないように、結果がキャッシュされます
- 結果はデータベース プロバイダーに渡されます
- データベース プロバイダーは、クエリのどの部分をデータベースで評価できるかを識別します
- クエリのこれらの部分は、データベース固有のクエリ言語 (リレーショナル データベースの場合は SQL など) に変換されます。
- クエリがデータベースに送信され、結果セットが返されます (結果はエンティティ インスタンスではなく、データベースからの値です)
- 結果セット内の各項目について
- クエリが追跡クエリの場合、EF は、データがコンテキスト インスタンスの変更トラッカーに既に存在するエンティティを表しているかどうかを確認します
- 存在する場合は、既存のエンティティが返されます
- そうでない場合は、新しいエンティティが作成され、変更の追跡が設定され、新しいエンティティが返されます
- クエリが追跡なしのクエリの場合、新しいエンティティは常に作成され、返されます
- クエリが追跡クエリの場合、EF は、データがコンテキスト インスタンスの変更トラッカーに既に存在するエンティティを表しているかどうかを確認します
クエリが実行されたとき
LINQ 演算子を呼び出すときは、クエリのメモリ内表現を構築するだけです。 クエリは、結果が使用されたときにのみデータベースに送信されます。
クエリがデータベースに送信される最も一般的な操作は次のとおりです。
-
forループで結果を反復処理する -
ToList、ToArray、Single、Count、または同等の非同期オーバーロードなどの演算子を使用する
Warnung
常にユーザー入力を検証します。 EF Core では、パラメーターを使用してクエリでリテラルをエスケープすることで SQL インジェクション攻撃から保護されますが、入力は検証されません。 アプリケーションの要件に従って適切な検証を実行してから、信頼されていないソースの値を LINQ クエリで使用するか、エンティティ プロパティに割り当てるか、他の EF Core API に渡す必要があります。 これには、クエリを動的に構築するために使用されるすべてのユーザー入力が含まれます。 LINQ を使用する場合でも、ユーザー入力を受け入れて式を作成する場合は、意図した式のみを構築できるようにする必要があります。
.NET