共用方式為


如何:使用程式碼擴充查詢的功能

如果要以超越查詢設計工具功能的方式修改查詢,您可以透過撰寫程式碼來擴充查詢。

Visual Studio LightSwitch 會結合您在查詢設計工具中指定的條件和您在程式碼中指定的條件,來產生查詢結果。 如需詳細資訊,請參閱查詢:從資料來源擷取資訊

注意事項注意事項

您無法擴充螢幕的查詢。您只能擴充出現在 [方案總管] 中的查詢。如需編輯螢幕之查詢的詳細資訊,請參閱 如何:篩選 Silverlight 螢幕上的資料

若要透過使用程式碼擴充查詢

  1. 在 [查詢設計工具] 中開啟查詢。 如需詳細資訊,請參閱 如何:新增、移除和修改查詢

  2. 在 [屬性] 視窗中,按一下 [編輯其他查詢程式碼]。

    伺服器程式碼檔案隨即在 [程式碼編輯器] 中開啟。 表示查詢的方法會顯示在程式碼檔案中。 方法名稱是以查詢名稱為開頭,並以 _PreprocessQuery 這個字為結尾。 例如,如果查詢的名稱是 GetCustomers,出現在程式碼編輯器中的方法名稱就是 GetCustomers_PreprocessQuery。

  3. 透過將程式碼加入至這個方法來自訂查詢。 使用 LINQ 語法。 如需如何在 Visual Basic 中撰寫 LINQ 查詢的詳細資訊,請參閱使用 Visual Basic 撰寫 LINQ 入門。 如需如何以 C# 撰寫查詢的詳細資訊,請參閱開始使用 C# 中的 LINQ

範例

下列範例示範透過使用程式碼來修改查詢的兩種方式。

基於銷售訂單的前 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 等運算。

所有購買特定產品的客戶

下面查詢會透過巡覽數個一對多關聯性,傳回所有購買特定產品的客戶。

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