クエリ ビルダー メソッド (Entity Framework)

ObjectQuery クラスは、概念モデルに対する LINQ to Entities クエリと Entity SQL クエリの両方をサポートしています。 ObjectQuery には、Entity SQL と等価のクエリ コマンドを順番に構築するために使用できる一連のクエリ ビルダー メソッドも実装されています。 次の表に、ObjectQuery のクエリ ビルダー メソッドおよび等価の Entity SQL ステートメントを示します。

ObjectQuery メソッド Entity SQL ステートメント

Distinct

DISTINCT

Except

EXCEPT

GroupBy

GROUP BY

Intersect

INTERSECT

OfType

OFTYPE

OrderBy

ORDER BY

Select

SELECT

SelectValue

SELECT VALUE

Skip

SKIP

Top

TOP および LIMIT

Union

UNION

UnionAll

UNION ALL

Where

WHERE

それぞれのクエリ ビルダー メソッドは、ObjectQuery の新しいインスタンスを返します。 そのため、先行する ObjectQuery インスタンスのシーケンスの操作に基づいた結果セットのクエリを作成できます。 次の例は、Where メソッドを使用して、ProductID によって返された Product オブジェクトをフィルターする方法を示します。

' Return Product objects with the specified ID. 
Dim query As ObjectQuery(Of Product) = context.Products.Where("it.ProductID = @product", New ObjectParameter("product", productId))
// Return Product objects with the specified ID.
ObjectQuery<Product> query =
    context.Products
    .Where("it.ProductID = @product",
    new ObjectParameter("product", productId));

ObjectQueryIQueryable および IEnumerable を実装しているので、ObjectQuery に実装されるクエリ ビルダー メソッドを LINQ 固有の標準クエリ演算子メソッド (FirstCount など) と組み合わせることが可能です。 クエリ ビルダー メソッドとは異なり、LINQ 演算子では、ObjectQuery が返されません。 詳細については、Visual Studio 2008 ドキュメントの「標準クエリ演算子の概要」を参照してください。

データの選択

既定では、ObjectQuery は、0 個以上の特定の型のエンティティ オブジェクトを返します。 後続のクエリ メソッド (WhereOrderBy など) を呼び出すと、元の ObjectQuery によって返されるオブジェクトのコレクションに影響します。 SelectGroupBy などのメソッドは、エンティティ型ではなく、DbDataRecord としてデータの投影を返します。 詳細については、「オブジェクト クエリ (Entity Framework)」を参照してください。 次の例では、入れ子になった SalesOrderHeader エンティティ型を含む DbDataRecord オブジェクトのコレクションが返されます。

' Define a query that returns a nested 
' DbDataRecord for the projection. 
Dim query As ObjectQuery(Of DbDataRecord) = context.Contacts.Select("it.FirstName, it.LastName, it.SalesOrderHeaders") _
                                            .Where("it.LastName = @ln", New ObjectParameter("ln", lastName))
// Define a query that returns a nested 
// DbDataRecord for the projection.
ObjectQuery<DbDataRecord> query =
    context.Contacts.Select("it.FirstName, "
        + "it.LastName, it.SalesOrderHeaders")
    .Where("it.LastName = @ln", new ObjectParameter("ln", lastName));

クエリ ビルダー メソッドは順番に適用されますが、Entity SQL でサポートされている、同じタイプの入れ子になったサブクエリを作成することも可能です。 そのためには、サブクエリを Entity SQL としてメソッドに含める必要があります。 次の例では、Select メソッド内で Entity SQL SELECT サブクエリを使用して LastName レコードを含めています。これらのレコードは、結果セットで入れ子になり、姓の最初の文字でアルファベット順に並べ替えられます。

' Define the query with a GROUP BY clause that returns 
' a set of nested LastName records grouped by first letter. 
Dim query As ObjectQuery(Of DbDataRecord) = _
    context.Contacts.GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln") _
    .Select("it.ln AS ln, (SELECT c1.LastName FROM AdventureWorksEntities.Contacts AS c1 " & _
            "WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT").OrderBy("it.ln")
// Define the query with a GROUP BY clause that returns
// a set of nested LastName records grouped by first letter.
ObjectQuery<DbDataRecord> query =
    context.Contacts
    .GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln")
    .Select("it.ln AS ln, (SELECT c1.LastName " +
    "FROM AdventureWorksEntities.Contacts AS c1 " +
    "WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT")
    .OrderBy("it.ln");
Bb896238.note(ja-jp,VS.100).gif注 :
ObjectQuery によって生成されるデータ ソース コマンドを表示するには、ToTraceString メソッドを使用します。詳細については、「オブジェクト クエリ (Entity Framework)」を参照してください。

別名

クエリ ビルダー メソッドが順番に適用されると、累積クエリ コマンドが構築されます。 これは、現在の ObjectQuery コマンドが、現在のメソッドの適用先であるサブクエリのように扱われることを意味します。

Bb896238.note(ja-jp,VS.100).gif注 :
CommandText プロパティは、ObjectQuery インスタンスに対するコマンドを返します。

クエリ ビルダー メソッドでは、別名を使用して現在の ObjectQuery コマンドを参照します。 次の例に示すように、既定では、文字列 "it" は現在のコマンドを表す別名です。

' Return Product objects with a standard cost 
' above 10 dollars. 
Dim cost = 10
Dim productQuery As ObjectQuery(Of Product) = context.Products.Where("it.StandardCost > @cost")
productQuery.Parameters.Add(New ObjectParameter("cost", cost))
int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
    context.Products
    .Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));

ObjectQueryName プロパティを設定すると、その値が後続のメソッドでの別名になります。 次の例では、ObjectQuery の名前を "product" に変更して、この別名を後続の OrderBy メソッドで使用することにより、前の例を拡張しています。

' Return Product objects with a standard cost 
' above 10 dollars. 
Dim cost = 10
Dim productQuery As ObjectQuery(Of Product) = context.Products.Where("it.StandardCost > @cost")
productQuery.Parameters.Add(New ObjectParameter("cost", cost))

' Set the Name property for the query and then 
' use that name as the alias in the subsequent 
' OrderBy method. 
productQuery.Name = "product"
Dim filteredProduct As ObjectQuery(Of Product) = productQuery.OrderBy("product.ProductID")
int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
    context.Products
    .Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));

// Set the Name property for the query and then 
// use that name as the alias in the subsequent 
// OrderBy method.
productQuery.Name = "product";
ObjectQuery<Product> filteredProduct = productQuery
    .OrderBy("product.ProductID");

パラメーター

Entity SQL 文字列入力を受け取るすべてのクエリ ビルダー メソッドは、パラメーター化クエリもサポートします。 Entity SQL 内のパラメーター名は、クエリ式の中で、先頭に @ 記号を付けることによって定義します。 詳細については、「パラメーター (Entity SQL)」を参照してください。 パラメーターは、ObjectParameter インスタンスの配列としてクエリ ビルダー メソッドに渡されます。 次の例では、2 つのパラメーターを Where メソッドに渡しています。

' Get the contacts with the specified name. 
Dim contactQuery As ObjectQuery(Of Contact) = context.Contacts.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.Contacts
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName),
    new ObjectParameter("fn", firstName));

パラメーターを使用する際の注意点

クエリ ビルダー メソッドでパラメーターを使用する際は、次の点に注意してください。

  • クエリ ビルダー メソッドに渡されるパラメーターは、シーケンスで ObjectQuery の後続のインスタンスによって集計されます。 これらのパラメーターには、Parameters プロパティを使用してアクセスできます。 クエリがコンパイルまたは実行されていない限り、パラメーターを追加した後で、コレクションからパラメーターを削除することも、コレクションをクリアすることもできます。 パラメーター名は変更できませんが、値はいつでも変更できます。

  • パラメーターは、ObjectParameterCollection 内で一意である必要があります。 コレクション内に同じ名前のパラメーターが 2 つ存在することはできません。

  • UnionUnionAllIntersect、および Except などの結合メソッドを使用すると、パラメーター コレクションが結合されます。 パラメーターのセットに互換性がない場合、パラメーターのセットが不完全な場合、または両方のクエリのパラメーター コレクションに同じ名前が存在する場合、例外がスローされます。

参照

概念

概念モデルに対するクエリ (Entity Framework)
関連オブジェクトの読み込み (Entity Framework)