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