クエリのしくみHow Queries Work

Entity Framework Core では、データベースからデータをクエリする言語統合クエリ (LINQ) を使用します。Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. LINQ では、派生コンテキストおよびエンティティ クラスに基づいて厳密に型指定のクエリを作成する (C#) (または任意の .NET 言語) を使用することができます。LINQ allows you to use C# (or your .NET language of choice) to write strongly typed queries based on your derived context and entity classes.

クエリの有効期間The life of a query

各クエリを通過するプロセスの高レベルな概要を次に示します。The following is a high level overview of the process each query goes through.

  1. データベース プロバイダーで処理する準備が整っている表現の構築に Entity Framework のコアで LINQ クエリの処理します。The LINQ query is processed by Entity Framework Core to build a representation that is ready to be processed by the database provider
    1. 結果をキャッシュすると、この処理は、クエリが実行されるたびに実行する必要はありません。The result is cached so that this processing does not need to be done every time the query is executed
  2. 結果は、データベース プロバイダーに渡されますThe result is passed to the database provider
    1. データベース プロバイダーを識別、クエリのどの部分は、データベースで評価されます。The database provider identifies which parts of the query can be evaluated in the database
    2. クエリのこの部分は、データベースの特定のクエリ言語 (リレーショナル データベースの SQL の場合など) に変換されます。These parts of the query are translated to database specific query language (e.g. SQL for a relational database)
    3. 1 つまたは複数のクエリは、データベースと、返される結果セットに送信されます (結果は、エンティティのインスタンスではない、データベースから値を)One or more queries are sent to the database and the result set returned (results are values from the database, not entity instances)
  3. 結果セット内の各アイテムのFor each item in the result set
    1. 追跡クエリの場合は、EF はデータ コンテキスト インスタンスに対して変更の追跡ツールで既にエンティティを表すかどうかを確認します。If this is a tracking query, EF checks if the data represents an entity already in the change tracker for the context instance
      • 既存のエンティティが返された場合は、If so, the existing entity is returned
      • ない場合は、新しいエンティティを作成、変更の追跡をセットアップ、および新しいエンティティが返されますIf not, a new entity is created, change tracking is setup, and the new entity is returned
    2. EF では、データがこのクエリの結果セット内の既存のエンティティを表すかどうかはチェックなしの追跡クエリの場合は、If this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • そのため、既存のエンティティが返される場合は(1)If so, the existing entity is returned (1)
      • ない場合、新しいエンティティが作成され、返されるIf not, a new entity is created and returned

(1)追跡クエリを使用していない弱い参照返されたエンティティを追跡します。(1) No tracking queries use weak references to keep track of entities that have already been returned. 同じ id を持つ前の結果がスコープ外に出るし、ガベージ コレクションの実行する場合、は、エンティティの新しいインスタンスを取得可能性があります。If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance.

クエリが実行されます。When queries are executed

LINQ 演算子を呼び出すときにクエリのメモリ内表現を構築するだけです。When you call LINQ operators, you are simply building up an in-memory representation of the query. クエリは結果を消費するときに、データベースにのみ送信されます。The query is only sent to the database when the results are consumed.

データベースに送信されるクエリになる最も一般的な演算は次のとおりです。The most common operations that result in the query being sent to the database are:

  • 結果を反復処理する、forループIterating the results in a for loop
  • などの演算子を使用してToListToArraySingleCountUsing an operator such as ToList, ToArray, Single, Count
  • データ バインドを UI にクエリの結果Databinding the results of a query to a UI

警告

ユーザー入力を必ず検証:中の EF は SQL インジェクション攻撃から保護を提供、入力のすべての一般的な検証を実行しません。Always validate user input: While EF does provide protection from SQL injection attacks, it does not do any general validation of input. したがって場合など、エンティティ プロパティに割り当てられている LINQ クエリで使用される Api に渡される値には、信頼できないソースし、アプリケーション要件に合わせて、適切な検証を実行する必要があります。Therefore if values being passed to APIs, used in LINQ queries, assigned to entity properties, etc., come from an untrusted source then appropriate validation, per your application requirements, should be performed. これには、動的にクエリを構築するために使用されるユーザー入力が含まれます。This includes any user input used to dynamically construct queries. LINQ を使用して、目的の式のみよりも確認する必要があります。 式を構築を構築できる、ユーザー入力を受け付けている場合場合でも。Even when using LINQ, if you are accepting user input to build expressions you need to make sure than only intended expressions can be constructed.