Понимание 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
Моя функция будет использоваться напрямую. (Однако это может быть неэффективным подходом, так как все строки будут возвращены с сервера.)