Возможно, вы путаете Linq с языком запросов к базе данных.Я бы посоветовал прочесть о Linq, в частности IQueryable vs IEnumerable .
Короче говоря, Linq - это язык запросов в коде, который может указывать практически на любой набор данных для выполнения поиска.проекции, агрегаты и т. д. аналогично моде как SQL, но не ограничиваются RDBMS.На первый взгляд, это не язык запросов к БД, такой как SQL;его можно просто перевести в единицу с помощью поставщика IQueryable, строки Linq2SQL, Linq2Azure, Linq для сущностей ... список можно продолжить.
Сторона IEnumerable в Linn, которая работает с объектами в памяти, которыеуже находятся в куче, почти наверняка будут работать лучше, чем сторона IQueryable, которая существует для перевода на собственный язык запросов, такой как SQL.Однако это не из-за слабости или силы, присущей какой-либо из сторон языка.Вместо этого (обычно) необходимо посылать переведенную команду IQueryable по сетевому каналу и получать результаты по тому же принципу, которые будут работать намного медленнее, чем память вашего локального компьютера.
Однако «тяжелая работа» по извлечению записей из хранилища данных и созданию представлений объектов в памяти должна быть выполнена в какое-то время, и IQueryable Linq почти наверняка будет быстрее, чем создание ВСЕХ записей, как в-памяти памяти, ТО, используя IEnumerable Linq (Linq 2 Objects) для фильтрации, чтобы получить ваши фактические данные.
Для иллюстрации: у вас есть таблица MyTable;он содержит относительно скромные 200 миллионов строк.При использовании провайдера Linq, такого как Linq2SQL, ваш код может выглядеть следующим образом:
//GetContext<>() is a method that will return the IQueryable provider
//used to produce MyTable entitiy objects
//pull all records for the past 5 days
var results = from t in Repository.GetContext<MyTable>()
where t.SomeDate >= DateTime.Today.AddDays(-5)
&& t.SomeDate <= DateTime.Now
select t;
Это будет переварено провайдером Linq2SQL IQueryable в строку SQL, такую как:
SELECT [each of MyTable's fields] FROM MyTable WHERE SomeDate Between @p1 and @p2; @p1 = '2/26/2011', @p2 = '3/3/2011 9:30:00'
Этот запросможет быть легко переварен механизмом SQL для возврата ТОЧНОЙ необходимой информации (скажем, 500 строк).
Без поставщика Linq, но при желании использовать Linq, вы можете сделать что-то вроде этого:
//GetAllMyTable() is a method that will execute and return the results of
//"Select * from MyTable"
//pull all records for the past 5 days
var results = from t in Repository.GetAllMyTable()
where t.SomeDate >= DateTime.Today.AddDays(-5)
&& t.SomeDate <= DateTime.Now
select t;
На первый взгляд, разница невелика.За кулисами дьявол в этих деталях.Этот второй запрос основан на методе, который извлекает и создает экземпляр объекта для каждой записи в базе данных.Это означает, что он должен извлечь все эти записи и создать для них место в памяти.Это даст вам список из 200 МИЛЛИОНОВ записей, что уже не так скромно, поскольку каждая из этих записей была передана по сети и теперь находится в вашем файле подкачки.Первый запрос МОЖЕТ внести некоторые издержки при построении и затем переваривании дерева выражений в SQL, но он НАМНОГО предпочтительнее, чем выгрузка всей таблицы в коллекцию в памяти и итерация по ней.