次の方法で共有


クエリのしくみ

Entity Framework Core では、言語統合クエリ (LINQ) を使用してデータベースのデータを照会します。 LINQ を使用すると、C# (または選択した .NET 言語) を使用して、派生コンテキストとエンティティ クラスに基づいて厳密に型指定されたクエリを記述できます。

この記事は古く、クエリ パイプラインの設計で発生した変更を考慮するために、一部の部分を更新する必要があります。 ここで言及されている動作について疑問がある場合は、 質問してください。

クエリの有効期間

次の説明は、各クエリが実行されるプロセスの概要です。

  1. LINQ クエリは Entity Framework Core によって処理され、データベース プロバイダーによって処理される準備ができている表現を構築します。
    1. クエリが実行されるたびにこの処理を実行する必要がないように、結果がキャッシュされます
  2. 結果はデータベース プロバイダーに渡されます
    1. データベース プロバイダーは、クエリのどの部分をデータベースで評価できるかを識別します
    2. クエリのこれらの部分は、データベース固有のクエリ言語 (リレーショナル データベースの場合は SQL など) に変換されます。
    3. クエリがデータベースに送信され、結果セットが返されます (結果はエンティティ インスタンスではなく、データベースからの値です)
  3. 結果セット内の各項目について
    1. クエリが追跡クエリの場合、EF は、データがコンテキスト インスタンスの変更トラッカーに既に存在するエンティティを表しているかどうかを確認します
      • 存在する場合は、既存のエンティティが返されます
      • そうでない場合は、新しいエンティティが作成され、変更の追跡が設定され、新しいエンティティが返されます
    2. クエリが追跡なしのクエリの場合、新しいエンティティは常に作成され、返されます

クエリが実行されたとき

LINQ 演算子を呼び出すときは、クエリのメモリ内表現を構築するだけです。 クエリは、結果が使用されたときにのみデータベースに送信されます。

クエリがデータベースに送信される最も一般的な操作は次のとおりです。

  • for ループで結果を反復処理する
  • ToListToArraySingleCount、または同等の非同期オーバーロードなどの演算子を使用する

Warnung

常にユーザー入力を検証します。 EF Core では、パラメーターを使用してクエリでリテラルをエスケープすることで SQL インジェクション攻撃から保護されますが、入力は検証されません。 アプリケーションの要件に従って適切な検証を実行してから、信頼されていないソースの値を LINQ クエリで使用するか、エンティティ プロパティに割り当てるか、他の EF Core API に渡す必要があります。 これには、クエリを動的に構築するために使用されるすべてのユーザー入力が含まれます。 LINQ を使用する場合でも、ユーザー入力を受け入れて式を作成する場合は、意図した式のみを構築できるようにする必要があります。