Образец поставщика LINQ для TerraServer
Обновлен: Ноябрь 2007
Данный пример представляет собой настраиваемый поставщик LINQ для веб-службы TerraServer-USA. Также в примере содержится клиентское приложение, использующее поставщик LINQ для запроса в веб-службе географических данных.
Веб-служба TerraServer-USA предоставляет метод, возвращающий сведения о местах в США, по части или полному названию места. Данный метод GetPlaceList является методом, вызываемым поставщиком LINQ для получения данных, для которых выполняется запрос LINQ. Поставщик использует Windows Communication Foundation (WCF) для связи с веб-службой. Дополнительные сведения о веб-службе TerraServer-USA см. в разделе Обзор веб-служб TerraServer-USA.
Поставщик LINQ, реализующий интерфейс IQueryable<T>, подобный данному, позволяет создавать запросы LINQ для источника данных, к которому подключается поставщик. Поставщик может выполнить запрос для самих данных или может преобразовать запрос LINQ в язык запросов, подходящий для источника данных, к которому он подключается. Поставщик получает данные из веб-службы и затем изменяет исходный запрос таким образом, чтобы выполнение запроса обрабатывалось в LINQ to Objects.
![]() |
---|
Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях “как есть”, без каких-либо гарантий. |
Получение примеров и инструкций по их установке
Выполните одно или несколько из следующих действий:
В меню Справка выберите пункт Примеры.
Файл Readme содержит информацию о примерах.
Посетите веб-узел примеров Visual Studio 2008 Здесь содержатся самые последние версии примеров.
Дополнительные сведения см. в разделе Поиск файлов примеров.
![]() |
---|
Этот пример доступен только в Интернете. |
Чтобы запустить клиентское приложение в Visual Studio:
Откройте файл LinqToTerraServerProvider.sln в Visual Studio.
В Обозревателе решений щелкните правой кнопкой мыши проект LinqToTerraServerProvider и выберите Построить.
В меню Отладка выберите команду Запуск без отладки.
Требования
Для выполнения данного примера необходимы следующие компоненты.
- Visual Studio 2008
Демонстрации
Этот пример демонстрирует реализацию IQueryable<T>, IOrderedQueryable<T> и IQueryProvider.
Решения на этапе разработки
В следующей таблице перечислены файлы проекта LinqToTerraServerProvider.
Файл |
Описание |
---|---|
Evaluator.cs |
Частично проверяет дерево выражений запроса. Преобразует все локальные ссылки на переменные в запросе LINQ в значения. |
ExpressionTreeHelpers.cs |
Содержит методы, которые могут быть использованы для определения сведений и извлечения данных из определенных типов деревьев выражений. |
ExpressionTreeModifier.cs |
Подкласс обхода дерева выражений, который изменяет дерево выражений, которое представляет полный запрос LINQ. |
ExpressionVisitor.cs |
Базовый класс обхода дерева выражений. |
InnermostWhereFinder.cs |
Подкласс обхода дерева выражений, который находит в дереве выражений запроса выражение, представляющее самый внутренний вызов метода Where. Это внутреннее выражение является выражением, из которого поставщик извлекает расположения для поиска. |
InvalidQueryException.cs |
Определяет исключение, которое возникает при использовании недопустимого запроса. |
LocationFinder.cs |
Подкласс, обходящий дерево выражений, который извлекает сведения о расположении из запроса LINQ для использования в запросе веб-службы. Данный класс принимает данные о расположении, предоставленные в одной из следующих форм:
|
Place.cs |
Определение пользовательского типа .NET для представления данных из веб-службы. |
QueryableTerraServerData.cs |
Содержит тип, для которого клиентский запрос определяет запросы. Этот тип реализует IOrderedQueryable<T> для поддержки сортировки в запросе. IOrderedQueryable<T> происходит от IQueryable<T>, поэтому при реализации IOrderedQueryable<T> данный тип также реализует IQueryable<T>. |
TerraServerQueryContext.cs |
Содержит класс, который организует работу по выполнению запроса. |
TerraServerQueryProvider.cs |
Содержит тип, реализующий интерфейс IQueryProvider. Методы, определяемые этим интерфейсом, вызываются стандартными методами операторов запросов, определенными в Queryable для выполнения запроса. |
TypeSystem.cs |
Этот вспомогательный класс реализует метод, используемый для предоставления типа элемента универсальной коллекции, содержащей результаты запроса. |
WebServiceHelper.cs |
Получает данные из веб-службы. Этот код содержит две проверки для улучшения удобства использования библиотеки поставщика. Первая проверка ограничивает максимальное время, которое клиентское приложение будет ожидать ответа, ограничивая общее число вызовов веб-службы за один запрос пятью. Вторая проверка определяет, равно ли число результатов, возвращаемых веб-службой максимальному числу результатов, которые она может возвращать. Если число результатов совпадает с максимальным числом, вполне вероятно, что результаты веб-службы, усекаются. Вместо возвращения неполного списка клиенту, поставщик выдает исключение. |
В следующей таблице перечислены файлы проекта ClientApp.
Файл |
Описание |
---|---|
Program.cs |
Содержит три примера запросов LINQ, которые запрашивают тип QueryableTerraServerData, определенный в проекте LinqToTerraServerProvider. |
app.config |
Содержит конечную точку, определяющую обмен данными приложения с веб-службой. |
Более подробное обсуждение этого настраиваемого поставщика LINQ см. в разделе Пошаговое руководство. Создание поставщика IQueryable LINQ.
См. также
Задачи
Практическое руководство. Реализация обхода дерева выражения