C # LINQ: В чем разница между моделью Pull и моделью Push? - PullRequest
3 голосов
/ 11 июня 2009

Я сейчас читаю C # 3.0 Албахари в книге «В двух словах» и на стр. 292 это говорит о LINQ:

LINQ следует за спросом pull модель, а не на основе предложения push модель.

Что означает приведенное выше утверждение?
И в чем разница между моделью pull и моделью push ?

Ответы [ 4 ]

8 голосов
/ 11 июня 2009

Я клиент, мне нужно что-то, вытянуть это с сервера.

Я сервер, у меня есть что-то, push это клиенту.

4 голосов
/ 11 июня 2009

Это означает, что ваши запросы LINQ будут извлекать данные из источника данных на основе ваших запросов и будут выполняться только при выполнении. В отличие от модели push, где сервер генерирует данные на своем конце, а затем отправляет данные клиенту. Push-модель будет похожа на Blackberry Enterprise Server, где электронная почта отправляется на устройство Blackberry, а не на устройство, постоянно запрашивающее его. Это также означает, что любые изменения, поскольку ваш запрос LINQ не будет отражен в вашем наборе данных.

3 голосов
/ 11 июня 2009

Чтобы по-настоящему понять (и оценить) различие, вам необходимо учитывать разницу между выражением и выражением . Как вы знаете, императивные языки программирования, такие как C # и VB, традиционно используют операторы, которые выполняются в определенной последовательности для достижения некоторой цели. В такой схеме вы извлекаете данные и затем помещаете их в некоторые другие операторы. Функциональное программирование, напротив, имеет тенденцию использовать выражений , которые являются просто значениями. В случае LINQ вы объявляете выражение запроса, которое в какой-то момент оценивается как значение, но не делает этого до тех пор, пока оно не понадобится. Это позволяет вам, как программисту, больше концентрироваться на том, что делает ваша программа, а не на том, как она это делает. В более широком смысле лень описывает стратегию оценки, которая обычно используется функциональными языками программирования. Например, если у вас было объявление вроде следующего:

let x = 2 * y + 7

ленивый язык программирования не потрудится оценивать выражение, пока ему это явно не нужно, но в то же время вы можете просто ссылаться на него с помощью привязки x . Точно так же, когда вы делаете объявление, подобное следующему в LINQ:

var collection = from s in S where predicate(s)

вы объявили выражение и связали его с collection , но на самом деле оно вам не нужно, пока вы что-то не сделаете с collection . Таким образом, вы можете объявить об этом где угодно в своем коде и не беспокоиться о том, что он занимает память, когда он не используется, и, таким образом, теперь вы больше задумываетесь о проблеме, которую пытаетесь решить, вместо того, чтобы подробно описывать, как должен работать компьютер. о ее решении.

Итак, в итоге, в (энергичном) императивном стиле программирования вы захватываете данные, а затем толкаете в какую-то функцию, которая будет воздействовать на них. В (ленивом) функциональном стиле программирования вы объявляете выражение, и в какой-то момент оно будет вычислено, когда это необходимо, что в случае с базой данных означает, что функция, которой необходимо значение выражения запроса, будет тянуть это когда это нужно. Однако Push / Pull действительно плохая терминология.

1 голос
/ 11 июня 2009

В модели извлечения обработка инициируется потребителем результата (результат «протягивается» через конвейер обработки).

В модели принудительной обработки обработка инициируется производителем данных (данные «проталкиваются» в конвейер обработки).

Таким образом, данные, которые будут обрабатываться, - это то, на что воздействуют в любом случае, и «направление» (push / pull), которое они перемещают, относительно человека, запускающего обработку.

...