2013-02-05 3 views
3

У меня есть запрос linq to entity.Выполняет ли `Any()` принудительное выполнение linq?

будет Any() сила linq осуществление (как ToList().)?

+0

Просмотрите [MSDN] (http://msdn.microsoft.com/en-us/library/bb534972.aspx) и выполните поиск _deferred_. Если вы его не нашли, метод принудительно выполнит выполнение запроса. –

ответ

11

Существует очень хорошая статья MSDN Classification of Standard Query Operators by Manner of Execution, которая описывает все стандартные операторы LINQ. Как видно из таблицы, Any выполняется немедленно (как все операторы, которые возвращают одно значение). Вы всегда можете ссылаться на эту таблицу, если у вас есть сомнения относительно способа выполнения оператора.

+8

+1 для очень хорошей ссылки –

1

Это легко обнаружить: Any() возвращает простой bool. Поскольку bool всегда является bool, а не IQueryable или IEnumerable (или любым другим типом), который может иметь собственную реализацию, мы должны заключить, что Any() сам должен вычислить возвращаемое логическое значение.

Исключением является, конечно, если Any() используется внутри подзапроса на IQueryable, и в этом случае поставщик Linq обычно просто анализирует наличие вызова Any() и преобразовывает его в соответствующий SQL (для пример).

1

Короткий вопрос, короткий ответ: Да, будет.

Чтобы узнать, соответствует ли какой-либо элемент списка данному условию (или вообще есть какой-либо элемент), список необходимо будет перечислить. Как MSDN states:

Этот метод не возвращает ни одного элемента коллекции. Вместо этого он определяет, содержит ли коллекция какие-либо элементы. Перечисление источника прекращается, как только результат может быть определен.

Отложенное выполнение здесь не действует, так как этот метод обеспечивает результат перечисления, а не другой IEnumerable.

1

Да, и нет. Метод any будет читать элементы из источника сразу, но не обязательно читать все предметы.

Метод Any будет перечислять элементы из источника, но только столько, сколько необходимо для определения результата.

Без каких-либо параметров метод Any попытается прочесть первый элемент из источника.

С помощью параметра метод Any будет считывать только элементы из источника, пока не найдет тот, который удовлетворяет условию. Все элементы считываются только из источника, если ни один элемент не удовлетворяет условию до последнего элемента.

Смежные вопросы