Читаемость является главной проблемой здесь. Считайте, что
Table.AsEnumerable().Where(somePredicate)
гораздо лучше читается, чем
((IEnumerable<TableObject>)Table).Where(somePredicate).
Или представьте, что хотите выполнить часть запроса на SQL Server, а остальную часть в памяти:
Table.Where(somePredicate)
.Select(someProjection)
.AsEnumerable()
.SomethingElse()
против
((IEnumerable<SomeProjectionType>)Table.Where(somePredicate)
.Select(someProjection))
.SomethingElse()
Теперь о том, почему такой метод полезен вообще, вспомним пример Table
в LINQ to SQL DataContext
. Поскольку Table
является IQueryable
, он реализует IEnumerable
. Когда вы вызываете метод Where
для такого Table
и перечисляете результаты, выполняется код, который в конечном итоге приводит к выполнению оператора SQL на SQL Server. AsEnumerable
говорит: нет, я не хочу использовать поставщик LINQ to SQL для выполнения Where
, я хочу использовать реализацию LINQ to Objects Where
.
Таким образом, перечисление более
Table.Where(somePredicate)
вызывает выполнение запроса на SQL Server, а перечисление более
Table.AsEnumerable().Where(somePredicate)
переносит таблицу, представленную Table
, в память и выполняет функцию Where
в памяти (а не на SQL Server!)
В этом смысл AsEnumerable
: позволить вам скрыть конкретную реализацию IEnumerable
методов и вместо этого использовать стандартную реализацию.