Включение источника данных для запросов LINQ
Существуют различные способы расширения LINQ для поддержки запросов LINQ к любому источнику данных.Источник данных может быть, например, структурой данных, веб-службой, файловой системой или базой данных.Шаблон LINQ упрощает для клиентов осуществление запросов к источникам данных, для которых задействована поддержка запросов LINQ, поскольку синтаксис и шаблон запроса не меняется.Далее перечислены способы, с помощью которых LINQ может быть расширен для этих источников данных.
Реализация интерфейса IEnumerable<T> в типе для выполнения запросов LINQ к объектам этого типа.
Создание методов стандартных операторов запроса, таких как Where и Select, расширяющих тип, для поддержки пользовательских запросов LINQ этого типа.
Создание поставщика для источника данных, который реализует интерфейс IQueryable<T>.Поставщик, реализующий этот интерфейс, получает запросы LINQ в виде деревьев выражения, которые он может выполнять любым способом, например удаленно.
Создание поставщика для источника данных, который использует преимущества существующей технологии LINQ.Такой поставщик позволит выполнять не только запросы, но и операции вставки, обновления, удаления и сопоставления для определяемых пользователем типов.
Эти варианты рассматриваются далее.
Включение поддержки запросов LINQ к пользовательскому источнику данных
Данные в памяти
Существует два способа включения поддержки запросов LINQ к данным, находящимся в памяти.Если данные имеют тип, который реализует IEnumerable<T>, можно выполнить запрос данных с помощью LINQ к объектам.Если добавление перечисления к типу с помощью реализации интерфейса IEnumerable<T> не имеет смысла, можно определить методы стандартных операторов запроса LINQ в типе, или создать методы стандартных операторов запроса LINQ, которые расширяют тип.Пользовательские реализации стандартных операторов запроса должны использовать отложенное выполнение для возврата результатов.
Удаленные данные
Лучшим вариантом для поддержки запросов LINQ к удаленному источнику данных является реализация интерфейса IQueryable<T>.Однако это отличается от расширения поставщика, например LINQ to SQL для источника данных.Модели поставщика для расширения существующих технологий LINQ, таких как LINQ to SQL, до других типов источников данных, доступных в Visual Studio 2008, отсутствуют.
Поставщики IQueryable LINQ
Поставщики LINQ, реализующие IQueryable<T>, могут существенно различаться по сложности.В этом разделе рассматриваются различные уровни сложности.
Менее сложные поставщики IQueryable могут взаимодействовать с одним методом веб-службы.Этот тип поставщиков является очень специализированным, так как он требует наличия определенных сведений в обрабатываемых запросах.Он имеет закрытую систему типов, возможно, предоставляя один тип результата.Большая часть выполнения запроса происходит локально, например с помощью реализации Enumerable стандартных операторов запроса.Менее сложный поставщик может проверять только одно выражение вызова метода в дереве выражений, которое представляет запрос, и оставляет оставшуюся логику запроса обрабатываться в другом месте.
Поставщик IQueryable средней сложности может использовать источник данных, который имеет ограниченно выразительный язык запросов.Если он предназначен для веб-службы, он может взаимодействовать с несколькими методами веб-службы и выбирать метод для вызова на основании вопроса, содержащегося в запросе.Поставщик средней сложности будет иметь более богатую систему типов, чем простой поставщик, но она по-прежнему будет фиксированной.Например, поставщик может предоставлять типы, имеющие связи "один ко многим", которые можно обойти, но он не предоставляет технологии отображения для определяемых пользователем типов.
Сложный поставщик IQueryable, например поставщик LINQ to SQL, может переводить завершенные запросы LINQ на выразительный язык запросов, например SQL. Сложный поставщик является более общим, чем менее сложный поставщик, из-за того, что он может обрабатывать более широкий диапазон вопросов в запросе.Он также имеет открытую систему типов и поэтому должен содержать расширяемую инфраструктуру для сопоставления определяемых пользователем типов.Разработка сложного поставщика требует значительных усилий.
Дополнительные сведения о создании собственного поставщика LINQ см. в разделе Пошаговое руководство. Создание поставщика IQueryable LINQ и публикациях LINQ: Building an IQueryable Provider и Link to Everything: A List of LINQ Providers в блогах MSDN.
См. также
Задачи
Пошаговое руководство. Создание поставщика IQueryable LINQ
Ссылки
Основные понятия
Общие сведения о стандартных операторах запроса