Поделиться через


Практическое руководство. Расширение запроса с помощью кода

Если требуется изменить запрос способами, которые выходят за рамки возможностей конструктора запросов, запрос можно расширить путем написания кода.

Чтобы получить результаты запроса, Visual Studio LightSwitch объединяет условия, указанные в конструкторе запросов, с условиями, определенными в коде. Дополнительные сведения см. в разделе Запросы: извлечение сведений из источника данных..

Примечание

Расширение запроса на экране не поддерживается.Расширять можно только запросы, отображаемые в области Обозреватель решений.Дополнительные сведения об изменении запроса на экране см. в разделе Практическое руководство. Фильтрация данных на экране Silverlight.

Расширение запроса с помощью кода

  1. Откройте запрос в области Конструктор запросов. Дополнительные сведения см. в разделе Практическое руководство. Добавление, удаление и изменение запроса.

  2. В окне Свойства выберите параметр Изменить дополнительный код запроса.

    В редакторе кода открывается файл серверного кода. Метод, который представляет требуемый запрос, отображается в файле кода. Имя метода начинается с имени запроса и заканчивается словом _PreprocessQuery. Например, если имя запроса — GetCustomers, имя метода, отображаемого в редакторе кода — GetCustomers_PreprocessQuery.

  3. Настройте запрос путем добавления кода в этот метод. Используйте синтаксис LINQ. Дополнительные сведения о создании запросов LINQ в Visual Basic см. в разделе Приступая к работе с LINQ в Visual Basic. Дополнительные сведения о создании запросов в C# см. в разделе Приступая к работе с LINQ в C#.

Примеры

В следующих примерах показаны два способа изменения запроса с помощью кода.

Лучшие 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. Конструктор запросов не поддерживает использование таких операций, как Count, Aggregate и Sum.

Все клиенты, которые приобрели конкретный продукт

Следующий запрос возвращает всех клиентов, которые приобрели конкретный продукт, путем перехода по нескольким отношениям "один ко многим".

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.

Сведения о выполнении запроса в пользовательском коде, который добавляется в приложение, см. в разделе Практическое руководство. Извлечение данных из запроса с помощью кода.

См. также

Задачи

Практическое руководство. Добавление, удаление и изменение запроса

Другие ресурсы

Запросы: извлечение сведений из источника данных.

Приступая к работе с LINQ в C#

Приступая к работе с LINQ в Visual Basic

LINQ в Visual Basic