Нет, это не так, поскольку Linq to Sql / Eft проанализирует запрос, чтобы создать оптимизированный sql-запрос для извлечения ваших данных, поскольку считается, что неправильное использование метода расширения (который вызывает GetEnumrator()
) или запроса может в конечном итоге загрузка всех элементов из таблицы.
Злоупотребление методами расширения, которые вызывают GetEnumerator()
context.Books.ToList().Where(somePredicate).Select(someSelector);
Это приведет к загрузке всей таблицы Books
, поскольку ToList()
вызовет запрос sql для извлечения всех объектов Book
. Оттуда вы Where
и Select
фактически работаете над Linq для объектов, а не Linq To Sql / Entities.
context.Books.Where(somePredicate).Select(someSelector).ToList();
Простое нажатие .ToList()
в конце оператора приведет к тому, что EF проанализирует запрос в действительный SQL-запрос и получит часть ваших книг при вызове .ToList()
.
Злоупотребление Func<T, bool>
Рассмотрим следующее,
Func<Book, bool> predicate = b=>b.Id == 3;
context.Where(predicate).ToList();
Теперь это выглядит совершенно корректно, однако, как только вы запустите запрос, вы обнаружите, что контекст загружает все Books
, что дает? Проще говоря, EF не может проанализировать предикат Func<T, bool>
на допустимый синтаксис sql, поскольку Func<>
является просто делегатом. Эта простая ошибка может привести к тому, что EF загрузит все Книги в контекст, а затем запустит Linq to Objects для загруженных Книг.
Expression<Func<Book, bool>> predicate = b=>b.Id == 3;
context.Where(predicate).ToList();
Теперь здесь мы собираемся использовать Expression<Func<Book, bool>>
, который является просто деревом выражений, EF знает, как анализировать дерево выражений, и способен создать действительный оператор SQL, который загружает только один Book
с Id из 3 .
Я уверен, что другие люди смогут включить еще несколько примеров, которые могут привести к загрузке всей таблицы, однако это наиболее вероятная ситуация, с которой вы столкнетесь.