Чтобы по-настоящему понять (и оценить) различие, вам необходимо учитывать разницу между выражением и выражением . Как вы знаете, императивные языки программирования, такие как C # и VB, традиционно используют операторы, которые выполняются в определенной последовательности для достижения некоторой цели. В такой схеме вы извлекаете данные и затем помещаете их в некоторые другие операторы. Функциональное программирование, напротив, имеет тенденцию использовать выражений , которые являются просто значениями. В случае LINQ вы объявляете выражение запроса, которое в какой-то момент оценивается как значение, но не делает этого до тех пор, пока оно не понадобится. Это позволяет вам, как программисту, больше концентрироваться на том, что делает ваша программа, а не на том, как она это делает. В более широком смысле лень описывает стратегию оценки, которая обычно используется функциональными языками программирования. Например, если у вас было объявление вроде следующего:
let x = 2 * y + 7
ленивый язык программирования не потрудится оценивать выражение, пока ему это явно не нужно, но в то же время вы можете просто ссылаться на него с помощью привязки x . Точно так же, когда вы делаете объявление, подобное следующему в LINQ:
var collection = from s in S where predicate(s)
вы объявили выражение и связали его с collection , но на самом деле оно вам не нужно, пока вы что-то не сделаете с collection . Таким образом, вы можете объявить об этом где угодно в своем коде и не беспокоиться о том, что он занимает память, когда он не используется, и, таким образом, теперь вы больше задумываетесь о проблеме, которую пытаетесь решить, вместо того, чтобы подробно описывать, как должен работать компьютер. о ее решении.
Итак, в итоге, в (энергичном) императивном стиле программирования вы захватываете данные, а затем толкаете в какую-то функцию, которая будет воздействовать на них. В (ленивом) функциональном стиле программирования вы объявляете выражение, и в какой-то момент оно будет вычислено, когда это необходимо, что в случае с базой данных означает, что функция, которой необходимо значение выражения запроса, будет тянуть это когда это нужно. Однако Push / Pull действительно плохая терминология.