There are three implementations of AsEnumerable
.
DataTableExtensions.AsEnumerable
Extends a DataTable
to give it an IEnumerable
interface so you can use Linq against the DataTable
.
Enumerable.AsEnumerable<TSource>
and ParallelEnumerable.AsEnumerable<TSource>
The AsEnumerable<TSource>(IEnumerable<TSource>)
method has no effect
other than to change the compile-time type of source from a type that
implements IEnumerable<T>
to IEnumerable<T>
itself.
AsEnumerable<TSource>(IEnumerable<TSource>)
can be used to choose
between query implementations when a sequence implements
IEnumerable<T>
but also has a different set of public query methods
available. For example, given a generic class Table
that implements
IEnumerable<T>
and has its own methods such as Where
, Select
, and
SelectMany
, a call to Where
would invoke the public Where
method of
Table
. A Table
type that represents a database table could have a
Where
method that takes the predicate argument as an expression tree
and converts the tree to SQL for remote execution. If remote execution
is not desired, for example because the predicate invokes a local
method, the AsEnumerable<TSource>
method can be used to hide the
custom methods and instead make the standard query operators
available.
In other words.
If I have an
IQueryable<X> sequence = ...;
from a LinqProvider, like Entity Framework, and I do,
sequence.Where(x => SomeUnusualPredicate(x));
that query will be composed and run on the server. This will fail at runtime because the EntityFramework doesn't know how to convert SomeUnusualPredicate
into SQL.
If I want that to run the statement with Linq to Objects instead, I do,
sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));
now the server will return all the data and the Enumerable.Where
from Linq to Objects will be used instead of the Query Provider's implementation.
It won't matter that Entity Framework doesn't know how to interpret SomeUnusualPredicate
, my function will be used directly. (However, this may be an inefficient approach since all rows will be returned from the server.)