C#LINQ:Pull模型和Push模型有什么区别?

时间:2009-06-11 06:04:08

标签: c# linq model push pull

我目前正在阅读Albahari的C# 3.0 in a Nutshell一书,并在page 292上说这是关于LINQ:

  

LINQ遵循需求驱动的 pull   模型,而不是供应驱动   推送模型。

上述陈述是什么意思?
pull 模型和 push 模型之间有什么区别?

4 个答案:

答案 0 :(得分:8)

我是客户,我需要一些东西,来自服务器。

我是服务器,我有一些东西,推送它到客户端。

答案 1 :(得分:4)

这意味着您的LINQ查询将根据您的查询从数据源中提取数据,并且只会在执行时完成。与推送模型相反,服务器在其末端生成数据,然后将数据推送到客户端。推送模型就像Blackberry Enterprise Server,其中电子邮件被推送到Blackberry设备,而不是设备不断地查询它。这也意味着自LINQ查询以来的任何更改都不会反映在数据集中。

答案 2 :(得分:3)

要真正理解(并欣赏)区别,您需要考虑语句表达式之间的区别。如您所知,C#和VB等命令式编程语言传统上使用按顺序执行的语句来实现某些目标。在这样的方案中,您检索数据,然后将其推送到其他一些语句。相反,函数式编程倾向于使用表达式,它们只是值。在LINQ的情况下,您声明一个查询表达式,在某些时候它将计算为一个值,但在需要之前它不会这样做。这使得您作为程序员可以更专注于您的程序而不是它的工作方式。更广泛地说,懒惰描述了一种通常由函数式编程语言使用的评估策略。例如,如果您有如下声明:

let x = 2 * y + 7

懒惰的编程语言在明确需要之前不会费心评估表达式,但同时你可以通过绑定 x 来引用它。以同样的方式,当您在LINQ中进行如下声明:

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

您已声明了一个表达式并将其绑定到 集合 ,但在您使用 集合执行某项操作之前,您实际上并不需要它EM> 即可。因此,您可以在代码中的任何位置声明它,而不用担心它在没有被使用时占用内存,因此您现在正在考虑更多关于您尝试解决的问题,而不是详细说明计算机应该如何进行关于解决它。

总而言之,在一种(急切的)命令式编程风格中,您可以获取数据,然后推送到某个将作用于它的函数上。在(懒惰)函数式编程中,您声明一个表达式,并且在某些时候它将在需要时进行求值,在数据库内容的情况下意味着需要查询表达式的值的函数将它需要的时候。推/拉真的是很糟糕的终结。

答案 3 :(得分:1)

在拉模型中,处理由结果的消费者发起(结果被“拉”通过处理管道)。

在推送模型中,处理由数据生产者启动(数据被“推送”到处理管道中)。

因此,在任何一种情况下,将要处理的数据和正在移动的“方向”(推/拉)是相对于触发处理的人。