代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

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

  •  3
  • Andreas Grech  · 技术社区  · 16 年前

    我现在在读阿尔巴哈里的书 C# 3.0 in a Nutshell 书与 page 292 上面提到了Linq:

    Linq遵循需求驱动 模型,而不是供应驱动的 模型。

    上面的陈述是什么意思?
    A和A之间的区别是什么? 模型与A 模型?

    4 回复  |  直到 12 年前
        1
  •  8
  •   Soviut    16 年前

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

    我是服务器,我有东西, 交给客户。

        2
  •  4
  •   jasonh    16 年前

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

        3
  •  3
  •   Rodrick Chapman    12 年前

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

    let x = 2 * y + 7
    

    一种懒惰的编程语言不会费心计算表达式,除非它显式地需要,但同时您可以通过绑定引用它。 X . 同样,当您在LINQ中进行如下声明时:

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

    您声明了一个表达式并将其绑定到 收集 但在你做一些事情之前你并不真正需要它 收集 . 因此,您可以在代码中的任何地方声明它,而不必担心它在不使用时占用内存,因此,您现在更多地考虑要解决的问题,而不是详细说明计算机应该如何解决它。

    因此,总之,在一种(迫切的)命令式编程中,您可以获取数据,然后 它将作用于某个函数。在一种(懒惰的)函数式编程中,您声明一个表达式,在某个时刻它将在需要的时候被计算出来,在数据库中,这意味着需要查询表达式值的函数将 当它需要的时候。然而,推/拉确实是个糟糕的术语。

        4
  •  1
  •   dmo    16 年前

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

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

    因此,无论在哪种情况下,将要处理的数据都是正在处理的,并且它移动的“方向”(推/拉)相对于触发处理的人。