Подтвердить что ты не робот

Какие операторы LINQ заставляют Entity Framework возвращаться из БД?

Я знаю несколько операторов LINQ, которые заставят EF оценивать и возвращать результаты из БД в память. .ToList() - один. Кто-нибудь имеет полный список заявлений, которые это делают?

Не уверен...

.SingleOrDefault()
.Union()

РЕДАКТИРОВАТЬ: Желаю, чтобы я принял все эти ответы. Отличная информация от всех!

4b9b3361

Ответ 1

Это длинный список. Они сводятся к

Aggregate
All<TSource>
Any
Average
Contains
Count
ElementAt<TSource>
ElementAtOrDefault<TSource>
Empty<TResult>
First
FirstOrDefault
Last
LastOrDefault
LongCount
Max
Min
SequenceEqual
Single
SingleOrDefault
Sum
ToArray<TSource>
ToDictionary
ToList<TSource>
ToLookup

Остальные - это отложенное потоковое выполнение или отложенное выполнение без потоковой передачи.

В свете вашего вопроса SingleOrDefault() является немедленным исполнением, а Union() - отложенным потоковым выполнением.

Ответ 2

Все, что возвращает конкретный объект или структуру данных (Count, Sum Single, First, ToList, ToArray и т.д.), оценивается сразу, поэтому SingleOrDefault конечно.

Все, что возвращает IQueryable<T> (Select, GroupBy, Take), будет отложено (так что операции могут быть закодированы), поэтому Queryable.Union будет отложено.

Все, возвращающее IEnumerable<T>, также будет отложено, но последующие запросы будут выполняться в Linq-to-objects, поэтому последующие операции не будут переведены на SQL. (Empty является исключением, поскольку на самом деле нечего откладывать - он просто возвращает пустую коллекцию)

Ответ 3

Из MSDN,

Запросы, которые выполняют функции агрегации по ряду источников элементы должны сначала перебирать эти элементы.

Примерами таких запросов являются Count, Max, Average и First. Они выполняются без явного выражения foreach, потому что сам запрос должен использовать foreach, чтобы вернуть результат.

Обратите внимание также, что эти типы запросов возвращают одно значение, а не IEnumerable.

Чтобы принудительно выполнить любой запрос и кешировать его результаты, вы может вызывать методы ToList <TSource> или ToArray <TSource> .

Ответ 4

В случае с Entity Framework есть простой способ обновить вашу память.

Entity Framework имеет Async варианты всех таких методов, определенных в System.Data.Entity, потому что Async не имеет смысла с другими, так как сам процесс запроса базы данных о том, что варианты Async выполняются асинхронно.

Итак, если есть вариант Async, то он попадает в базу данных, а в противном случае - нет.

Перечисление или создание IEnumerable<T> - это частичный случай: Акт получения IEnumerable<T>, получающего его счетчик (как это происходит в начале блоков foreach), не попадает в базу данных, но первый MoveNext() (что происходит сразу в пределах foreach, попадает в базу данных, а затем продолжает поток из набора результатов до тех пор, пока либо MoveNext() не вернет значение false (например, когда foreach достигнет "естественного" конца) или перечислитель (как при foreach прерывается).