У меня есть запрос linq to entity
.Выполняет ли `Any()` принудительное выполнение linq?
будет Any()
сила linq осуществление (как ToList()
.)?
У меня есть запрос linq to entity
.Выполняет ли `Any()` принудительное выполнение linq?
будет Any()
сила linq осуществление (как ToList()
.)?
Существует очень хорошая статья MSDN Classification of Standard Query Operators by Manner of Execution, которая описывает все стандартные операторы LINQ. Как видно из таблицы, Any
выполняется немедленно (как все операторы, которые возвращают одно значение). Вы всегда можете ссылаться на эту таблицу, если у вас есть сомнения относительно способа выполнения оператора.
+1 для очень хорошей ссылки –
Это легко обнаружить: Any() возвращает простой bool. Поскольку bool всегда является bool, а не IQueryable или IEnumerable (или любым другим типом), который может иметь собственную реализацию, мы должны заключить, что Any() сам должен вычислить возвращаемое логическое значение.
Исключением является, конечно, если Any() используется внутри подзапроса на IQueryable, и в этом случае поставщик Linq обычно просто анализирует наличие вызова Any() и преобразовывает его в соответствующий SQL (для пример).
Короткий вопрос, короткий ответ: Да, будет.
Чтобы узнать, соответствует ли какой-либо элемент списка данному условию (или вообще есть какой-либо элемент), список необходимо будет перечислить. Как MSDN states:
Этот метод не возвращает ни одного элемента коллекции. Вместо этого он определяет, содержит ли коллекция какие-либо элементы. Перечисление источника прекращается, как только результат может быть определен.
Отложенное выполнение здесь не действует, так как этот метод обеспечивает результат перечисления, а не другой IEnumerable
.
Да, и нет. Метод any
будет читать элементы из источника сразу, но не обязательно читать все предметы.
Метод Any
будет перечислять элементы из источника, но только столько, сколько необходимо для определения результата.
Без каких-либо параметров метод Any
попытается прочесть первый элемент из источника.
С помощью параметра метод Any
будет считывать только элементы из источника, пока не найдет тот, который удовлетворяет условию. Все элементы считываются только из источника, если ни один элемент не удовлетворяет условию до последнего элемента.
Просмотрите [MSDN] (http://msdn.microsoft.com/en-us/library/bb534972.aspx) и выполните поиск _deferred_. Если вы его не нашли, метод принудительно выполнит выполнение запроса. –