2016-12-01 8 views
0

Использует ли ключевое слово TAKE в запросе linq выполнение этого запроса linq для короткого замыкания при оценке или делает это. Любой метод вызывает короткое замыкание?Использует ли LINQ ключевое слово LINK «TAKE»?

value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any 
+1

Оба. Take возьмет только первую 1 запись, а затем любое короткое замыкание, как только найдет ту, которая соответствует (но из-за берется только максимум 1). Вы можете безопасно удалить Take 1 и иметь такую ​​же производительность. –

+0

Удивительно, спасибо за ответ! –

+0

@RobertMcKee Это должен быть ответ, а не комментарий ... –

ответ

1

Оба. Take возьмет только первую 1 запись, а затем любое короткое замыкание, как только найдет ту, которая соответствует (но из-за берется только максимум 1). Вы можете безопасно удалить Take 1 и иметь такую ​​же производительность.

0

Термин Короткое замыкание здесь не применимо, потому что это около boolean evaluation. См. Некоторые примеры here. Он не применяется, потому что Take не возвращает логическое значение.

Что вы, вероятно, хотите задать: Take выполнить, если Any является следующим методом в строке? Логически, Take может быть пропущен, если также выполняется Any, потому что Any также останавливается после того, как нашел первый матч.

Однако, мы просто смотрим на пару методов расширения, называемых последовательно:

value = MyDataTable.AsEnumerable() _ 
     .Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _ 
     .(Take(1)) _ 
     .Any() 

So Take бежит, а затем любой метод случается прийти на следующий, в этом случае Any. Как бы Take знать, что его не нужно запускать? Это можно легко продемонстрировать, если вы создаете собственные методы расширения из source code и добавляете инструкции trace.

Возможно, основной вопрос заключается в том, имеет ли значение производительность? Ну, это две итерации (вершины) против одной, пытаясь предотвратить ее, это будет микро-оптимизация.