Практическое руководство. Расширение запроса с помощью кода
Если требуется изменить запрос способами, которые выходят за рамки возможностей конструктора запросов, запрос можно расширить путем написания кода.
Чтобы получить результаты запроса, Visual Studio LightSwitch объединяет условия, указанные в конструкторе запросов, с условиями, определенными в коде. Дополнительные сведения см. в разделе Запросы: извлечение сведений из источника данных..
Примечание
Расширение запроса на экране не поддерживается.Расширять можно только запросы, отображаемые в области Обозреватель решений.Дополнительные сведения об изменении запроса на экране см. в разделе Практическое руководство. Фильтрация данных на экране Silverlight.
Расширение запроса с помощью кода
Откройте запрос в области Конструктор запросов. Дополнительные сведения см. в разделе Практическое руководство. Добавление, удаление и изменение запроса.
В окне Свойства выберите параметр Изменить дополнительный код запроса.
В редакторе кода открывается файл серверного кода. Метод, который представляет требуемый запрос, отображается в файле кода. Имя метода начинается с имени запроса и заканчивается словом _PreprocessQuery. Например, если имя запроса — GetCustomers, имя метода, отображаемого в редакторе кода — GetCustomers_PreprocessQuery.
Настройте запрос путем добавления кода в этот метод. Используйте синтаксис 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#