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


Включение источника данных для запросов LINQ (Visual Basic)

Существуют различные способы расширения LINQ, позволяющие запрашивать любой источник данных в шаблоне LINQ. Источник данных может быть структурой данных, веб-службой, файловой системой или базой данных, чтобы назвать некоторые. Шаблон LINQ упрощает запрос к источнику данных, для которого включен запрос LINQ, так как синтаксис и шаблон запроса не изменяются. К таким источникам данных относятся следующие способы расширения LINQ:

  • Реализация интерфейса IEnumerable<T> в типе для предоставления возможности выполнения запросов LINQ to Objects для этого типа.

  • Создание стандартных методов операторов запросов, таких как Where и Select, которые расширяют тип для выполнения пользовательских запросов LINQ этого типа.

  • Создание поставщика для источника данных, который реализует интерфейс IQueryable<T>. Поставщик, реализующий этот интерфейс, получает запросы LINQ в виде деревьев выражений, которые могут выполняться в пользовательском режиме, например удаленно.

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

В этом разделе рассматриваются эти параметры.

Как включить возможность выполнения запросов LINQ к вашему источнику данных

In-Memory Данные

Существует два способа включения запросов LINQ к данным в памяти. Если данные являются типом, реализующим IEnumerable<T>, можно запросить данные с помощью LINQ to Objects. Если нет смысла поддерживать перечисление для вашего типа, реализуя IEnumerable<T> интерфейс, можно определить методы оператора стандартного запроса LINQ в этом типе или создать стандартные методы оператора запросов LINQ, расширяющие этот тип. Пользовательские реализации стандартных операторов запросов должны использовать отложенное выполнение для возврата результатов.

Удаленные данные

Лучший вариант включения запросов LINQ к удаленному источнику данных — реализовать IQueryable<T> интерфейс. Однако это отличается от расширения такого поставщика, как LINQ to SQL, для источника данных. В Visual Studio 2008 нет моделей поставщиков для расширения существующих технологий LINQ, таких как LINQ to SQL, на другие типы источников данных.

Поставщики IQueryable LINQ

Поставщики LINQ, которые реализуют IQueryable<T> , могут значительно отличаться в их сложности. В этом разделе рассматриваются различные уровни сложности.

Менее сложный IQueryable поставщик может взаимодействовать с одним методом веб-службы. Этот тип поставщика очень конкретный, так как он ожидает конкретных сведений в запросах, которые он обрабатывает. Он имеет систему закрытого типа, возможно, предоставляя один тип результата. Большая часть выполнения запроса происходит локально, например с помощью Enumerable реализаций стандартных операторов запросов. Менее сложный поставщик может изучить только одно выражение вызова метода в дереве выражений, представляющее запрос, и позволить оставшейся логике запроса обрабатываться в другом месте.

Поставщик IQueryable средней сложности может использовать источник данных с частично экспрессивным языком запросов. Если он предназначен для веб-службы, он может взаимодействовать с несколькими методами этой службы и выбрать метод для вызова на основе вопроса, который задает запрос. Поставщик средней сложности будет иметь более богатую систему типов, чем простой поставщик, но она по-прежнему будет фиксированной системой типов. Например, поставщик может предоставлять типы, имеющие связи "один ко многим", которые можно обойти, но не предоставляют технологии сопоставления для определяемых пользователем типов.

Сложный IQueryable поставщик, например поставщик LINQ to SQL, может перевести полные запросы LINQ на язык экспрессивных запросов, например SQL. Сложный поставщик является более общим, чем менее сложный поставщик, так как он может обрабатывать более широкий спектр вопросов в запросе. Он также имеет систему открытого типа и поэтому должен содержать обширную инфраструктуру для сопоставления определяемых пользователем типов. Для разработки сложного поставщика требуется значительное количество усилий.

См. также