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


Образец поставщика 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.

Bb892929.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях “как есть”, без каких-либо гарантий.

Получение примеров и инструкций по их установке

  • Выполните одно или несколько из следующих действий:

    • В меню Справка выберите пункт Примеры.

      Файл Readme содержит информацию о примерах.

    • Посетите веб-узел примеров Visual Studio 2008 Здесь содержатся самые последние версии примеров.

Дополнительные сведения см. в разделе Поиск файлов примеров.

Bb892929.alert_note(ru-ru,VS.90).gifПримечание.

Этот пример доступен только в Интернете.

Чтобы запустить клиентское приложение в Visual Studio:

  1. Откройте файл LinqToTerraServerProvider.sln в Visual Studio.

  2. В Обозревателе решений щелкните правой кнопкой мыши проект LinqToTerraServerProvider и выберите Построить.

  3. В меню Отладка выберите команду Запуск без отладки.

Требования

Для выполнения данного примера необходимы следующие компоненты.

  • 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.Name == "Seattle".

  • Выражение вызова метода для метода StartsWith, например place.Name.StartsWith("Seat").

  • Выражение вызова метода для методов Enumerable.Contains и List<T>.Contains, например placeList.Contains(place.Name).

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.

См. также

Задачи

Практическое руководство. Реализация обхода дерева выражения

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

Примеры LINQ на языке C#