オブジェクト クエリ (Entity Framework)

ObjectQuery ジェネリック クラスは、0 個以上の型指定されたエンティティ オブジェクトのコレクションを返すクエリを表します。オブジェクト クエリは、常に既存のオブジェクト コンテキストに帰属します。このコンテキストにより、クエリの作成と実行に必要な接続情報とメタデータ情報が提供されます。型指定された ObjectContext には、型指定された ObjectQuery インスタンスを返す一連のプロパティが含まれています。これらのプロパティのいずれかがモデル内の各エンティティ型に対応します。これらのプロパティを使用すると、型指定された ObjectQuery のインスタンスを簡単に作成できます。オブジェクト クエリは次のシナリオで実行されます。

  • foreach (C#) や For Each (Visual Basic) 列挙などの操作を実行するとき。

  • List コレクションにデータを設定するためにクエリが割り当てられているとき。

  • Execute メソッドが明示的に呼び出されたとき。

  • FirstAny などの LINQ クエリ実行演算子が呼び出されたとき。詳細については、「クエリ ビルダ メソッド (Entity Framework)」を参照してください。

次のクエリは、渡されたパラメータによって指定された名と姓を含む Contact オブジェクトを返します。

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

オブジェクト コンテキストを使用してクエリを作成および実行する方法の完全な例については、「エンティティ型を返すクエリの実行方法 (Entity Framework)」を参照してください。Entity SQL クエリの詳細については、「Entity SQL 言語」を参照してください。

クエリ投影

オブジェクト クエリはエンティティ オブジェクトとして エンティティ データ モデル (EDM) データを返しますが、エンティティ型に容易に具体化できないデータを返す投影もサポートします。ObjectQuery では、エンティティ型以外 (入れ子になった結果または匿名型) を返す投影に、DbDataRecord 型が使用されます。Int32String などの単純型は、1 つのプロパティ値を返す投影で使用されます。

Select クエリ ビルダ メソッドは、実行時に DbDataRecord オブジェクトのコレクションを返す ObjectQuery を返します。LINQ to Entities と Entity SQL はどちらもクエリ投影をサポートします。クエリ投影の例については、以下の例を参照してください。

次の注意事項は、クエリの投影に適用されます。

  • ObjectQuery は、スカラ結果のコレクションではなく単一のスカラ結果を表すように初期化できます。一部の拡張メソッドは、入力としてコレクション結果を必要とします。その場合、次の例に示すように、これらのメソッドの 1 つが呼び出されたときに ArgumentException がスローされます。

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • プリミティブ型への投影時に ObjectQuerynull 値を返す可能性がある場合は、その型の NULL 許容バージョンを使用する必要があります。次のクエリでは、SalesOrderHeader オブジェクトの ShipDate プロパティが null 値を返す可能性があるため、NULL 値を許容する DateTime を使用しています。

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    詳細については、「NULL 許容型 (Visual Basic プログラミング ガイド)」または「null 許容型 (C# プログラミング ガイド)」を参照してください。

コマンド タイムアウトの設定

オブジェクト クエリおよび SaveChanges 操作の既定のタイムアウトは、基になる接続プロバイダによって定義されます。しかし、次の例に示すように、この既定のタイムアウト値は、ObjectContextCommandTimeout プロパティを使用してオーバーライドできます。

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

この処理は、複雑なクエリがある場合や、SaveChanges に対するクエリまたは呼び出しでその他のパフォーマンスの問題によってタイムアウトが頻繁に発生する場合に行います。

ストア コマンドの表示

EDM に対してクエリを実行すると、エンティティ フレームワーク により、EDM に基づいた LINQ to Entities および Entity SQL クエリがデータ ソースに対する同等のクエリに変換されます。Object Services には、ToTraceString メソッドが提供されており、これを使用すると、データ ソースに対するトレースを行わなくても、実行時に ObjectQuery に対するストア コマンドを表示できます。EntityClient プロバイダの EntityCommand にも、ToTraceString メソッドが提供されています。詳細については、「格納コマンドを表示する方法 (Entity Framework)」を参照してください。

EntityKey によるオブジェクトの取得

エンティティのキー値がわかっている場合は、オブジェクト クエリを明示的に作成して実行しなくてもデータ ソースからキー値を取得できます。ObjectContextGetObjectByKey メソッドおよび TryGetObjectByKey メソッドは、指定された EntityKey と共に、オブジェクトをオブジェクト コンテキストに返します。EntityKey が既存のエンティティに対応しない場合は、GetObjectByKey を使用するときに ObjectNotFoundException を処理する必要があります。詳細については、「キーを使用して特定のオブジェクトを返す方法 (Entity Framework)」を参照してください。

参照

概念

オブジェクトとしてのデータのクエリ (Entity Framework)