2016-08-09 6 views
0

У меня есть путаница в том, что в Linq-to-Object мы работаем с данными в памяти для выполнения запроса LINQ, который является процессом с помощью языка C#.Является ли LINQ-to-Object поставщиком LINQ?

Когда я пишу запрос Linq, который выполняет базу данных в памяти, почему мы используем поставщика (LINQ-to-Object)?

ответ

2

No, Linq to Object ЯВЛЯЕТСЯ НЕ ПРОВАЙДЕРОМ, и ему не нужно ретранслировать на любой другой промежуточный провайдер для запуска запроса (linq to object).

Чтобы понять это более четко, мы должны понять, что такое поставщик на самом деле. Поставщик - это в основном реализация, реализующая IQueryProvider и Интерфейс IQueryable, и это в основном переводит ваш запрос linq на SOMETHING, который понимает ваш провайдер. Например, когда вы идете на LINQ to SQL запрашивает ваши запросы, конвертированные/переведенные в SQL, его переводить на SQL, потому что ваш провайдер (в данном случае) понимает только SQL.

Когда вы запускаете запрос против коллекции данных In-Memory, C# не нужно переводить ваш запрос linq в другой запрос.

Как @Stilgar упоминание «Провайдеры используются, когда источник IQueryable». Когда вы работаете с данными In-Memory, ваш источник в основном IEnumerable.

2

LINQ to Objects не является поставщиком LINQ. Это реализация LINQ API для IEnumerable. API LINQ может быть реализован практически любым типом, если вы правильно назовете свои методы и принимаете правильные аргументы. Это говорит о том, что есть что-то очень близкое к провайдеру LINQ, связанному с LINQ to Objects. Провайдеры используются, когда источником является IQueryable, а компилятор создает дерево выражений. Дерево выражений может быть скомпилировано для делегата, поэтому метод компиляции действует как нечто очень похожее на поставщика LINQ.

Также обратите внимание, что на практике «поставщик LINQ» часто используется для простого указания реализации LINQ API. Это похоже на то, как «аргумент» и «параметр» используются взаимозаменяемо, несмотря на небольшую разницу.

Смежные вопросы