Цель поставщика Linq состоит в том, чтобы в основном «перевести» деревья выражений Linq (которые построены за кулисами запроса) в исходный язык запросов источника данных. В случаях, когда данные уже находятся в памяти, вам не нужен поставщик Linq; Линк 2 Объекты прекрасны. Однако, если вы используете Linq для общения с внешним хранилищем данных, например с СУБД или облаком, это абсолютно необходимо.
Основная предпосылка любой структуры запросов заключается в том, что движок источника данных должен выполнять как можно большую часть работы и возвращать только те данные, которые необходимы клиенту. Это связано с тем, что предполагается, что источник данных лучше всего знает, как управлять хранящимися в нем данными, а также потому, что сетевой транспорт данных относительно дорог по времени и поэтому должен быть сведен к минимуму. Теперь, в действительности, эта вторая часть «возвращает только данные, запрашиваемые клиентом»; сервер не может читать мысли вашей программы и знать, что ей действительно нужно; он может дать только то, о чем просили. Здесь интеллектуальный поставщик Linq полностью сдувает «наивную» реализацию. Используя сторону IQueryable Linq, которая генерирует деревья выражений, поставщик Linq может преобразовать дерево выражений в, скажем, инструкцию SQL, которую СУБД будет использовать для возврата записей, запрашиваемых клиентом в инструкции Linq. Наивная реализация потребует получить ВСЕ записи с использованием некоторого широкого оператора SQL, чтобы предоставить клиенту список объектов в памяти, а затем все действия по фильтрации, группировке, сортировке и т. Д. Выполняются клиентом.
Например, предположим, что вы использовали Linq для получения записи из таблицы в базе данных по ее первичному ключу. Поставщик Linq может перевести dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()
в «SELECT TOP 1 * from MyObjectTable WHERE Id = 1234». Это возвращает ноль или одну запись.«Наивная» реализация, вероятно, отправит серверу запрос «SELECT * FROM MyObjectTable», а затем используйте IEnumerable сторону Linq (которая работает в классах в памяти) для фильтрации. В заявлении вы ожидаете получить результаты 0-1 из таблицы с 10 миллионами записей, какой из них, по вашему мнению, будет выполнять работу быстрее (или даже работать вообще, без нехватки памяти)?
Не уверен, почему прибыль от linq-to-excel от IQueryable, но бывают случаи, когда код намного быстрее. – CodesInChaos