Czy to Linq czy Lambda?

105

Wiem, że to jest Linq:

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

Wiem, że to jest Lambda:

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

Uwaga redaktora: powyższe to nie tylko Lambda, to Linq używający "Method Syntax", którego predykatem jest Lambda. Żeby było jasne, obie powyższe próbki to Linq (mój oryginalny post był niepoprawny, ale zostawiłem błąd, aby zilustrować zamieszanie, które spowodowało pytanie).

Ale czy Linq jest podzbiorem Lambda, czy co?

Dlaczego istnieją dwie pozornie identyczne technologie?

Czy istnieje techniczny powód, aby wybrać jedną z nich?

Jerry Nixon
źródło
2
Korekta: lambdaexpression.net
Jerry Nixon

Odpowiedzi:

135

To jest LINQ (przy użyciu składni zapytania):

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

To także LINQ (przy użyciu składni metody):

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

Warto zauważyć, że oba te smaki ostatecznie utworzą dokładnie ten sam kod. Kompilator oferuje usługę, umożliwiając wyrażanie życzeń w preferowany sposób.

A to jest lambda:

x => x.Value == 1

Gdy zdecydujesz się użyć składni metody, LINQ jest prawie zawsze widoczny wokół wyrażeń lambda. Ale LINQ i lambdy to dwie zupełnie różne rzeczy, z których obie mogą być używane samodzielnie.

Aktualizacja: Jak słusznie wskazuje svick, LINQ ze składnią zapytań jest również zaimplementowany przy użyciu wyrażeń lambda (jak wspomniano wcześniej, kompilator umożliwia pisanie w składni zapytania, ale skutecznie przekształca ją na składnię metody za plecami). Jest to po prostu piętrzą się na fakcie, że oba smaki są całkowicie równoważne i będą zachowywać się w ten sam sposób (np. Wyrażenia lambda mogą powodować tworzenie domknięć ).

Jon
źródło
2
Myślę, że warto wspomnieć, że składnia zapytań również wykorzystuje lambdy w tle. Może to być ważne z powodu zamknięć.
svick
34

Obie są Linq. Drugi jest przy użyciu lambda .

Lambdy to elementy typu wbudowanego, które przekazujesz jako parametr do funkcji Where w drugim przykładzie.

Różnica między tymi dwiema składniami jest czysto składniowa. Drugim stylem linq używającym wywołań metod jest to, jak działa pod maską. Pierwsza ma być bardziej przyjazna dla użytkownika / łatwiejsza, a kompilator konwertuje ją na wywołania metod zakulisowe. Powinny działać tak samo dla każdego zapytania, chociaż oczywiście kompilator może wybrać nieco inną interpretację skomplikowanego zapytania linq niż przy konwersji na styl metody.

Ten artykuł msdn może być również interesujący: Składnia zapytania LINQ a składnia metody . Szczególnie istotne jest: „Ogólnie zalecamy składnię zapytań, ponieważ jest ona zwykle prostsza i bardziej czytelna; jednak nie ma semantycznej różnicy między składnią metody a składnią zapytania”.

Chris
źródło
6
Osobiście uważam, że składnia metody jest bardziej czytelna - być może dlatego, że większość mojego kodu ma odmianę „LINQ to Objects”. Ale jeśli masz duże doświadczenie w SQL, być może składnia zapytań będzie na początku łatwiejsza do zrozumienia.
Tom Bushell,
@Tom Bushell, a nawet składnia JOIN? Poważnie?
Jerry Nixon
@Tom Bushell: ja też. Parafrazowałem coś na tej stronie MSDN, co prawdopodobnie wyjaśnia, dlaczego zadali sobie trud rozwijania tej składni, a nie tylko stylu metody. Zwykle robię tylko względnie podstawowe rzeczy, zamiast łączenia lub cokolwiek innego bardziej skomplikowanego (tj. Głównie filtrowanie lub operacje mapowania jeden do jednego).
Chris,
@Jerry - podobnie jak Chris, moja praca w LINQ do tej pory była dość prosta. Czytałem, że składnia zapytania jest zwykle lepsza podczas wykonywania SelectMany, Join lub GroupJoin - po prostu nie musiałem robić nic takiego - jeszcze!
Tom Bushell
1
Wewnętrznie „składnia zapytania” była określana w zespołach LINQ to SQL i LINQ to Entities jako „składnia rozumienia”.
DamienG