2011-09-12 12 views
81

So che questo è Linq:È Linq o Lambda?

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

E so che questo è Lambda: nota

var _Results = _List.Where(x => x.Value == 1); 

Editor di: quanto sopra non è semplicemente Lambda, è Linq con il " Metodo Sintassi "il cui predicato è un Lambda. Per essere chiari, entrambi gli esempi precedenti di sono Linq (il mio post originale non era corretto, ma ho lasciato l'errore per illustrare la confusione che ha generato la domanda).

Ma Linq è un sottoinsieme di Lambda o cosa?

Perché ci sono due tecnici apparentemente identici?

Esiste un motivo tecnico per scegliere l'uno rispetto all'altro?

+2

Correzione: http://www.lambdaexpression.net/ –

risposta

112

Questo è LINQ (utilizzando la sintassi di query):

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

Questo è anche LINQ (utilizzando il metodo sintassi):

var _Results = _List.Where(x => x.Value == 1); 

È interessante notare che both of these flavors finirà per produrre la stessa identica codice. Il compilatore ti offre un servizio permettendoti di esprimere i tuoi desideri nel modo che preferisci.

E questo è una lambda:

x => x.Value == 1 

Quando si sceglie di utilizzare la sintassi metodo, LINQ è quasi sempre visto intorno espressioni lambda. Ma LINQ e lambdas sono due cose completamente diverse, che possono essere utilizzate da sole.

Aggiornamento: Come svick giustamente sottolinea, LINQ con sintassi di query è anche implementato usando le espressioni lambda (come detto in precedenza, il compilatore permette di scrivere nella sintassi di query, ma in modo efficace lo trasforma in sintassi del metodo dietro la schiena). Si tratta solo del fatto che entrambi i sapori sono totalmente equivalenti e si comportano allo stesso modo (ad esempio, espressioni lambda possono causare la creazione di closures).

+2

Penso che valga la pena ricordare che la sintassi delle query utilizza lambda anche dietro le quinte. Questo può essere importante a causa delle chiusure. – svick

+0

@svick: Infatti, risposta aggiornata. – Jon

30

Entrambi sono Linq. Il secondo è utilizzandoLambdas.

Lambdas sono il tipo di metodo inline che stai passando come parametro alla funzione Where nel secondo esempio.

La differenza tra queste due sintassi è puramente sintattica. Il secondo stile di linq che usa le chiamate al metodo è come funziona sotto il cofano. Il primo è pensato per essere più facile da usare/più facile e il compilatore lo converte in chiamate di metodo dietro le quinte. Dovrebbero funzionare allo stesso modo per qualsiasi query, anche se ovviamente il compilatore può scegliere un'interpretazione leggermente diversa di una query complicata su linq di quella che si farebbe quando si converte in stile metodo.

Questo articolo di msdn potrebbe interessare anche: LINQ Query Syntax versus Method Syntax. Di particolare rilevanza è: "In generale, si consiglia la sintassi della query perché è di solito più semplice e più leggibile, tuttavia non esiste alcuna differenza semantica tra la sintassi del metodo e la sintassi della query."

+1

+1 per la raccomandazione MSDN. –

+4

Personalmente, trovo la sintassi del metodo più leggibile, forse perché la maggior parte del mio codice è della varietà "LINQ to Objects". Ma se hai un sacco di esperienza SQL, forse la sintassi delle query sarà più facile da capire all'inizio. –

+0

@Tom Bushell, anche sintassi JOIN? Sul serio? –

Problemi correlati