È Linq o Lambda?


105

So che questo è Linq:

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

E so che questo è Lambda:

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

Nota del redattore: quanto sopra non è semplicemente Lambda, è Linq che utilizza il "Method Syntax" il cui predicato è un Lambda. Per essere chiari, entrambi gli esempi precedenti sono Linq (il mio post originale non era corretto, ma ho lasciato l'errore per illustrare la confusione che ha sollevato la domanda).

Ma Linq è un sottoinsieme di Lambda o cosa?

Perché ci sono due tecnologie apparentemente identiche?

C'è un motivo tecnico per sceglierne uno rispetto all'altro?


Risposte:


135

Questo è LINQ (utilizzando la sintassi della query):

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

Anche questo è LINQ (utilizzando la sintassi del metodo):

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

È interessante notare che entrambe queste versioni finiranno per produrre lo stesso identico codice. Il compilatore ti offre un servizio permettendoti di esprimere i tuoi desideri nel modo che preferisci.

E questo è un lambda:

x => x.Value == 1

Quando scegli di usare la sintassi del metodo, LINQ è quasi sempre visto attorno alle espressioni lambda. Ma LINQ e lambda sono due cose completamente diverse, entrambe possono essere usate da sole.

Aggiornamento: come sottolinea giustamente svick, LINQ con sintassi di query viene implementato anche utilizzando espressioni lambda (come accennato in precedenza, il compilatore consente di scrivere nella sintassi della query ma la trasforma efficacemente nella sintassi del metodo dietro le spalle). Questo sta solo accumulando sul fatto che entrambi i gusti sono totalmente equivalenti e si comporteranno allo stesso modo (ad esempio, le espressioni lambda possono causare la creazione di chiusure ).


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

34

Entrambi sono Linq. Il secondo sta usando Lambdas .

Lambda sono le cose del 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 linq che utilizza le chiamate al metodo è come funziona sotto il cofano. Il primo è pensato per essere più facile da usare / facile e il compilatore lo converte in chiamate di metodo dietro le quinte. Dovrebbero funzionare allo stesso modo per qualsiasi query, sebbene ovviamente il compilatore possa scegliere un'interpretazione leggermente diversa di una query linq complicata rispetto a quando si converte in uno stile di metodo.

Potrebbe interessarti anche questo articolo di msdn: Sintassi della query LINQ e sintassi del metodo . Di particolare rilevanza è: "In generale, consigliamo la sintassi della query perché di solito è più semplice e più leggibile; tuttavia non vi è alcuna differenza semantica tra la sintassi del metodo e la sintassi della query."


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

@Tom Bushell, anche la sintassi JOIN? Sul serio?
Jerry Nixon

@Tom Bushell: anche io. Stavo parafrasando qualcosa su quella pagina MSDN che presumibilmente spiega perché si sono presi la briga di sviluppare quella sintassi piuttosto che avere solo lo stile del metodo. Di solito sto solo facendo cose relativamente semplici piuttosto che unioni o qualsiasi altra cosa più complicata (cioè principalmente filtri o operazioni di mappatura uno a uno).
Chris

@ Jerry - come Chris, il mio lavoro su LINQ è stato abbastanza semplice finora. Ho letto che la sintassi delle query è solitamente preferibile quando si esegue SelectMany, Join o GroupJoin - non ho ancora avuto bisogno di fare nulla del genere - ancora!
Tom Bushell

1
All'interno dei team LINQ to SQL e LINQ to Entities la "sintassi della query" veniva chiamata "sintassi di comprensione".
DamienG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.