C#LINQ:拉模式和推模式有什么区别?

C#LINQ:拉模式和推模式有什么区别?,c#,linq,model,push,pull,C#,Linq,Model,Push,Pull,我目前正在读Albahari的书,书上写着关于LINQ: LINQ遵循需求驱动的拉动 模型,而不是供应驱动的 推送模型 上面的说法是什么意思? 拉模型和推模型的区别是什么?这意味着您的LINQ查询将根据您的查询从数据源中拉取数据,并且仅在执行时执行。与推送模式相反,服务器在其端生成数据,然后将数据推送到客户端。推送模式类似于Blackberry Enterprise Server,将电子邮件推送到Blackberry设备,而不是设备不断地查询电子邮件。这也意味着自LINQ查询以来的任何更改都不会

我目前正在读Albahari的书,书上写着关于LINQ:

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

上面的说法是什么意思?

拉模型和推模型的区别是什么?

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

在拉式模型中,处理由结果的使用者启动(结果通过处理管道“拉式”处理)

在推送模型中,处理由数据的生产者发起(数据被“推送”到处理管道中)


因此,无论哪种情况,将要处理的数据都是正在被操作的数据,并且它移动的“方向”(推/拉)与触发处理的人有关。

我是客户,我需要一些东西,从服务器上拉它

<>我是服务器,我有东西,<强>推< /强>客户端。

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

let x = 2 * y + 7
一种懒惰的编程语言在明确需要计算表达式之前不会费心计算表达式,但同时您可以通过绑定x引用它。同样,当您在LINQ中做出如下声明时:

var collection = from s in S where predicate(s)
您已经声明了一个表达式并将其绑定到集合,但在对集合执行某些操作之前,您实际上并不需要它。因此,您可以在代码中的任何位置声明它,而不必担心它在不使用时占用内存,因此您现在更多地考虑您试图解决的问题,而不是详细说明计算机应该如何解决它


因此,总而言之,在(急切的)命令式编程风格中,您获取数据,然后将其推送到将对其起作用的某个函数上。在(惰性)函数式编程中,您声明一个表达式,并在需要时对其进行计算,对于数据库填充,这意味着需要查询表达式值的函数将在需要时提取它。“推/拉”真的是个糟糕的术语。

我喜欢在老苹果II+上玩《洛奇的靴子》和《机器人奥德赛》作为提示!您是第一个认识到它的人。:-)