Существует три реализации AsEnumerable
.
DataTableExtensions.AsEnumerable
Расширяет DataTable
, чтобы дать ему интерфейс IEnumerable
, чтобы вы могли использовать Linq против DataTable
.
Enumerable.AsEnumerable<TSource>
и ParallelEnumerable.AsEnumerable<TSource>
Метод AsEnumerable<TSource>(IEnumerable<TSource>)
не имеет никакого эффекта
кроме того, чтобы изменить тип источника времени компиляции от типа, который
реализует от IEnumerable<T>
до IEnumerable<T>
.
AsEnumerable<TSource>(IEnumerable<TSource>)
можно использовать для выбора
между реализациями запросов, когда последовательность реализует
IEnumerable<T>
но также имеет другой набор открытых методов запросов
имеется в наличии. Например, учитывая универсальный класс Table
, который реализует
IEnumerable<T>
и имеет свои собственные методы, такие как Where
, Select
и
SelectMany
, вызов Where
вызовет публичный Where
метод
Table
. Тип Table
, представляющий таблицу базы данных, может иметь
Where
метод, который принимает аргумент предиката в качестве дерева выражений
и преобразует дерево в SQL для удаленного выполнения. Если удаленное исполнение
нежелательно, например, потому что предикат вызывает локальный
метод, метод AsEnumerable<TSource>
может быть использован, чтобы скрыть
пользовательские методы и вместо этого сделать стандартные операторы запросов
имеется.
Другими словами.
Если у меня есть
IQueryable<X> sequence = ...;
от LinqProvider, как Entity Framework, и я,
sequence.Where(x => SomeUnusualPredicate(x));
этот запрос будет составлен и запущен на сервере. Это не удастся во время выполнения, потому что EntityFramework не знает, как преобразовать SomeUnusualPredicate
в SQL.
Если я хочу, чтобы вместо этого запускался оператор с Linq to Objects, я делаю,
sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));
теперь сервер вернет все данные, и вместо реализации провайдера запросов будет использоваться Enumerable.Where
из Linq в Objects.
Не имеет значения, что Entity Framework не знает, как интерпретировать SomeUnusualPredicate
, моя функция будет использоваться напрямую. (Однако это может быть неэффективным подходом, поскольку все строки будут возвращены с сервера.)