如何:使用代码扩展查询

如果您要以超出查询设计器能力的方式修改查询,则可以通过编写代码来扩展查询。

Visual Studio LightSwitch 会把您在查询设计器中定义的条件与您在您的代码中指定的条件结合起来。有关更多信息,请参见 查询:从数据源检索信息

说明说明

您无法扩展屏幕的查询。您只可以扩展在“解决方案资源管理器”中出现的查询。有关编辑屏幕查询的更多信息,请参见 如何:筛选 Silverlight 屏幕上的数据

使用代码扩展查询

  1. 在**“查询设计器”**中打开查询。有关更多信息,请参见 如何:添加、删除和修改查询

  2. 在**“属性”窗口中,单击“编辑其他查询代码”**。

    服务器代码文件会在代码编辑器中打开。表示您的查询的方法会出现在代码文件中。方法的名称以您的查询的名称开头,并以单词 _PreprocessQuery 结束。例如,如果您的查询名称是 GetCustomers,则代码编辑器中出现的方法名称为 GetCustomers_PreprocessQuery。

  3. 通过将代码添加到此方法,可自定义查询。使用 LINQ 语法。有关如何在 Visual Basic 中编写 LINQ 查询的更多信息,请参见 Visual Basic 中的 LINQ 入门。有关如何在 C# 中写入查询的更多信息,请参见 C# 中的 LINQ 入门

示例

下面的示例演示了通过使用代码来修改查询两种方式。

Ff852040.collapse_all(zh-cn,VS.110).gif基于销售订单的前 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

Ff852040.collapse_all(zh-cn,VS.110).gif所有购买了特定产品的客户

以下查询通过导航一对多关系返回所有购买了特定产品的客户。

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