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

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

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

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

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

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

Эти варианты рассматриваются далее.

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

Данные в памяти

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

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

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

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

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

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

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

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

См. также