Запросы Linq, содержащие эквивалент "AsEnumerable()"

Являются ли эти 2 запроса функционально эквивалентными?

1)

var z=Categories
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName).AsEnumerable()
         .Select((x,i)=>new {x.CategoryName,Rank=i});

2)

var z=Categories.AsEnumerable()
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName)
         .Select((x,i)=>new {x.CategoryName,Rank=i});

Я имею в виду, изменяет ли порядок "AsNumerable()" в запросе количество элементов данных, извлекаемых из клиента, или способ их получения?

Спасибо за помощь.

2 ответа

Решение

Являются ли эти 2 запроса функционально эквивалентными?

Если под эквивалентом вы подразумеваете окончательные результаты, то, вероятно, да (в зависимости от того, как провайдер реализует эти операции), разница заключается во втором запросе, который вы используете расширения в памяти.

Я имею в виду, изменяет ли порядок "AsNumerable()" в запросе количество элементов данных, извлекаемых из клиента, или способ их получения?

Да, в первом запросе Where а также OrderBy будет переведен в SQL и Select будет выполнен в памяти.

Во втором запросе вся информация из базы данных заносится в память, затем фильтруется и преобразуется в память.


Categories вероятно IQueryableтак что вы будете использовать расширения в Queryable учебный класс. эта версия расширений получает Expression в качестве параметра, и эти деревья выражений позволяют преобразовывать ваш код в запросы SQL.

AsEnumerable() возвращает объект как IEnumerableтак что вы будете использовать расширения в Enumerable класс, который выполняется непосредственно в памяти.

Да, они делают то же самое, но по-разному. Первый запрос выполняет весь выбор, упорядочение и условия в самой базе данных SQL.

Однако второй сегмент кода извлекает все строки из базы данных и сохраняет их в памяти. Затем, после сортировки, упорядочивания и применения условий к извлеченным данным, т.е. теперь в памяти.

AsEnumerable () разбивает запрос на две части:

  1. Inside-Part(запрос перед AsEnumerable) выполняется как LINQ-to-SQL
  2. Внешняя часть (запрос после AsEnumerable) выполняется как LINQ-to-Objects
Другие вопросы по тегам