Понимание AsEnumerable в Linq для объектов

Написано на MSDN:

Возвращает ввод, напечатанный как IEnumerable<T>,

Я не понимаю. Помогите мне понять этот метод.

1 ответ

Есть три реализации 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 = ...;

от провайдера Linq, как Entity Framework, и я делаю,

sequence.Where(x => SomeUnusualPredicate(x));

этот запрос будет составлен и запущен на сервере. Это не удастся во время выполнения, потому что Entity Framework не знает, как конвертировать SomeUnusualPredicate в SQL.

Если я хочу, чтобы вместо этого запускался оператор с Linq to Objects, я делаю,

sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));

Теперь сервер вернет все данные и Enumerable.Where от Linq до Objects будет использоваться вместо реализации Query Provider.

Не имеет значения, что Entity Framework не знает, как интерпретировать SomeUnusualPredicate Моя функция будет использоваться напрямую. (Однако это может быть неэффективным подходом, так как все строки будут возвращены с сервера.)

Другие вопросы по тегам