次の方法で共有


方法: コードを使用してクエリを拡張する

クエリ デザイナーの機能を上回る方法でクエリを変更する場合は、コードを記述してクエリを拡張できます。

Visual Studio LightSwitch は、クエリ デザイナーで指定した条件を、クエリ結果を生成するためにコードで指定する条件に組み合わせたものです。 詳細については、「クエリ: データ ソースからの情報の取得」を参照してください。

注意

画面のクエリを拡張することはできません。ソリューション エクスプ ローラーに表示されるクエリのみを拡張できます。画面のクエリを編集することの詳細については、「方法: Silverlight の画面上のデータをフィルター処理する」を参照してください。

コードを使用してクエリを拡張するには

  1. クエリ デザイナーでクエリが開かれます。 詳細については、「方法: クエリを追加、削除、変更する」を参照してください。

  2. [プロパティ] ウィンドウで、[追加クエリ コードの編集] をクリックします。

    コード エディターでサーバー コード ファイルが開きます。 クエリを表すメソッドがコード ファイルに表示されます。 メソッドの名前は、クエリ名で始まり、単語 _PreprocessQuery で終わります。 たとえば、クエリの名前が GetCustomers の場合、コード エディターに表示されるメソッドの名前は GetCustomers_PreprocessQuery です。

  3. このメソッドにコードを追加して、クエリをカスタマイズします。 LINQ 構文を使用します。 Visual Basic で LINQ クエリを記述する方法の詳細については、「Visual Basic の LINQ の概要」を参照してください。 C# でクエリを記述する方法の詳細については、「C# の LINQ の概要」を参照してください。

次の例は、コードを使用してクエリを変更する 2 つの方法を示します。

販売注文に基づく上位 N 件の顧客

次のクエリは、最も多く注文を発注した顧客を返します。 TopN パラメーターがメソッドに渡されます。 TopN パラメーターで、結果で返される顧客の数が指定されます。

注意

クエリ デザイナーでパラメーターを追加します。

Private Sub TopNSalesOrders_PreprocessQuery _
    (ByVal TopN As System.Nullable(Of Short), _
     ByRef query As System.Linq.IQueryable(Of LS_Queries_VB.Customer))
    query = From myCustomer In query
           Where myCustomer.Orders.Count > 0
           Select myCustomer
           Order By myCustomer.Orders.Count Descending
           Take (TopN)
End Sub
partial void TopNSalesOrders_PreprocessQuery
    (short? TopN, ref IQueryable<Customer> query)
{
    query = (from myCustomer in query
             where myCustomer.Orders.Count() > 0
             orderby myCustomer.Orders.Count() descending 
             select myCustomer).Take(System.Convert.ToInt16(TopN));
}

次の理由により、このクエリはクエリ デザイナーでデザインできません。

  • 注文は、顧客と注文のリレーションシップの複数の側に表示されます。 クエリ デザイナーを使用すると、多重度が多の関連エンティティを参照できなくなります。

  • クエリは、Count 操作を使用して、注文をカウントします。 クエリ デザイナーは、CountAggregateSum などの操作の使用をサポートしていません。

特定の製品を購入したすべての顧客

次のクエリは、複数の 1 対多のリレーションシップから、特定の製品を購入したすべての顧客を返します。

Private Sub CustomersWhoBoughtProduct_PreprocessQuery _
    (ByVal ProductID As System.Nullable(Of Short), _
     ByRef query As System.Linq.IQueryable(Of LS_Queries_VB.Customer))
    query = From myCustomers In query
        From myOrders In myCustomers.Orders
        From myOrderDetails In myOrders.Order_Details
        Where myOrderDetails.Product.ProductID = ProductID
        Select Customers
End Sub
partial void CustomersWhoBoughtProduct_PreprocessQuery
    (short? ProductID, ref IQueryable<Customer> query)
{
    query = from myCustomers in query
            from myOrders in myCustomers.Orders
            from myOrderDetails in myOrders.Order_Details
            where myOrderDetails.Product.ProductID == ProductID
            select myCustomers;
}

クエリ デザイナーを使用すると、多重度が多の関連エンティティを参照できなくなるため、このクエリをクエリ デザイナーでデザインすることはできません。

次の手順

クエリを視覚的にデザインする方法については、「方法: クエリ デザイナーを使用してクエリをデザインする」を参照してください。

画面でのクエリの使用方法を調べるには、「方法: Silverlight の画面上のデータをフィルター処理する」を参照してください。

アプリケーションに追加するカスタム コード内でクエリを実行する方法については、「方法: コードを使用してクエリからデータを取得する」を参照してください。

参照

処理手順

方法: クエリを追加、削除、変更する

その他の技術情報

クエリ: データ ソースからの情報の取得

C# の LINQ の概要

Visual Basic の LINQ の概要

Visual Basic における LINQ