Pergunta

Atualmente, estou lendo de Albahari C # 3.0 in a Nutshell livro e em página 292 ele diz isso sobre LINQ:

LINQ segue uma orientada para a procura puxar modelo, ao invés de uma oferta orientada impulso modelo.

O que a declaração acima média?
E qual é a diferença entre um puxar modelo e um impulso modelo?

Foi útil?

Solução

Eu sou o cliente, eu preciso de alguma coisa, puxar -lo do servidor.

Eu sou o servidor, eu tenho algo, impulso para o cliente.

Outras dicas

Isto significa que suas consultas LINQ irá extrair dados de uma fonte de dados com base em suas consultas e somente será feito quando executado. Ao contrário de um modelo de envio, onde o servidor gera os dados em sua extremidade e, em seguida, empurra os dados para um cliente. Um modelo de envio seria como Blackberry Enterprise Server onde email é empurrado para o dispositivo Blackberry em vez do dispositivo ter que constantemente consulta para ele. Isto também significa que quaisquer alterações desde a sua consulta LINQ não será refletido em seu conjunto de dados.

Para realmente entender (e apreciar) a distinção que você precisa considerar a diferença entre um declaração e um expressão . Como você sabe, linguagens de programação imperativas, como C # e VB tradicionalmente utilizar instruções que são executadas em uma seqüência para realizar algum objetivo. Em tal esquema, você recuperar os dados e, em seguida, empurre-o para algumas outras declarações. A programação funcional, ao contrário, tende a usar expressões , que são valores apenas. No caso de LINQ você declarar uma expressão de consulta que em algum momento irá avaliar para um valor, mas não fazê-lo até que seja necessário. Isso permite que você, como o programador, concentrar-se mais do que o seu programa faz, em vez de como ele faz isso. Mais amplamente, a preguiça descreve uma estratégia de avaliação que é normalmente empregada por linguagens de programação funcional. Por exemplo, se você tivesse uma declaração como a seguinte:

let x = 2 * y + 7

a linguagem de programação preguiçoso não me incomodaria avaliação da expressão até que ele precisa explicitamente, mas nesse meio tempo você pode apenas se referem a ele pela ligação x . Da mesma forma, quando você faz uma declaração como a seguinte em LINQ:

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

você declarou uma expressão e ligou-o a coleção , mas você realmente não precisa dele até que você faça algo com coleção . Então você pode declará-lo em qualquer lugar em seu código e não se preocupar com isso ocupando memória quando ele não está sendo usado e, portanto, você está pensando agora mais sobre o problema que você está tentando resolver em vez de especificar em detalhe exaustiva como o computador deve ir cerca de resolvê-lo.

Assim, em resumo, num (ansioso) estilo imperativo de programação você pegar os dados e, em seguida, impulso -lo para alguma função que vai agir sobre ela. Em um estilo (preguiçoso) funcional de programação, você declarar uma expressão e em algum momento ele será avaliado quando necessário, o que, no caso do material de banco de dados significa que a função que precisa o valor da expressão de consulta irá tração -lo quando ele precisa. Push / Pull realmente é pobre terminolgy embora.

Em um modelo de puxar o processamento é iniciado pelo consumidor do resultado (o resultado está sendo "puxado" através do pipeline de processamento).

Em um modelo push o processamento é iniciado pelo produtor dos dados (os dados são "empurrados" para o pipeline de processamento).

Assim, os dados que serão processados ??é o que está sendo posta em prática em ambos os casos e a "direção" (push / pull) ele está se movendo é relativa à pessoa acionando o processamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top