Какие операторы LINQ заставляют Entity Framework возвращаться из БД?
Я знаю несколько операторов LINQ, которые заставят EF оценивать и возвращать результаты из БД в память. .ToList()
- один. Кто-нибудь имеет полный список заявлений, которые это делают?
Не уверен...
.SingleOrDefault()
.Union()
РЕДАКТИРОВАТЬ: Желаю, чтобы я принял все эти ответы. Отличная информация от всех!
Ответы
Ответ 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
прерывается).