我目前正在阅读Albahari的简单地说,C# 3.0书,在第292页上,它提到了LINQ:
LINQ采用的是需求驱动的拉动模型,而不是供应驱动的推送模型。
以上的说法是什么意思?
拉模型和推模型有什么区别?
发布于 2009-06-11 06:15:12
我是客户,我需要一些东西,从服务器上拔出。
我是服务器,我有东西,把推到客户端。
发布于 2009-06-11 06:07:08
这意味着LINQ查询将根据查询从数据源中提取数据,并且只有在执行时才会执行。与推送模型相反,服务器在其端生成数据,然后将数据推送到客户端。推模式就像黑莓企业服务器(),其中电子邮件被推送到黑莓设备,而不是设备必须不断地查询它。这也意味着,自LINQ查询以来的任何更改都不会反映在您的数据集中。
发布于 2009-06-11 06:36:18
要真正理解(并欣赏)区别,您需要考虑语句和表达式之间的区别。如您所知,命令式编程语言(如C#和VB )通常使用按顺序执行的语句来完成某个目标。在这种方案中,您检索数据,然后将其推送到其他语句上。相反,函数式编程倾向于使用仅仅是值的表达式。在LINQ的情况下,您可以声明一个查询表达式,该表达式在某一点上将计算为一个值,但在需要之前它不会这样做。这让您,作为程序员,更多地关注您的程序所做的事情,而不是它是如何实现的。更广泛地说,惰性描述了一种通常由函数式编程语言使用的评估策略。例如,如果您有如下所示的声明:
let x = 2 * y + 7
惰性编程语言在显式需要之前不会对表达式进行计算,但同时,您可以通过绑定x来引用它。同样,当您在LINQ中进行如下声明时:
var collection = from s in S where predicate(s)
您已经声明了一个表达式,并将其绑定到集合,但在使用集合执行某些操作之前,实际上并不需要它。因此,您可以在代码中的任何地方声明它,而不必担心它在未被使用时占用内存,因此,您现在正在更多地考虑您试图解决的问题,而不是详尽地说明计算机应该如何解决它。
因此,总之,在一种(急切的)命令式编程风格中,您获取数据,然后将其推送到某个作用于它的函数上。在一种(惰性)函数式的编程中,您声明一个表达式,并在需要时对它进行评估,对于数据库内容,这意味着需要查询表达式值的函数会在需要时将其提取出来。推/拉确实是很糟糕的术语。
https://stackoverflow.com/questions/979570
复制相似问题