W innych językach programowania widziałem Map and Reduce, a są to podstawy programowania funkcjonalnego. Nie mogłem znaleźć żadnego uzasadnienia ani historii, dlaczego LINQ ma Aggregate
(to samo jako Reduce
) i Select
(to samo jak Map
)?
Pytam, dlaczego zajęło mi trochę czasu, aby zrozumieć, że to to samo i jestem ciekawy, co jest tego powodem.
Odpowiedzi:
Sprowadza się to głównie do historii LINQ.
LINQ pierwotnie miał być podobny do SQL i był używany (w dużej mierze, choć nie wyłącznie) do łączenia się z bazami danych SQL. Prowadzi to do tego, że duża część terminologii jest oparta na SQL.
Tak więc, „wybierz” pochodzi z SQL
select
oświadczenie i „agregat” pochodzi z SQL zagregowanych funkcji (na przykładcount
,sum
,avg
,min
,max
).Dla tych, którzy kwestionują stopień, w jakim LINQ pierwotnie odnosi się do SQL, odsyłam do (na przykład) artykułów Microsoftu na temat Cω, który był językiem opracowanym przez Microsoft Research, i wydaje się, że tam, gdzie pracowała większość podstaw LINQ obecnie, zanim zostały dodane do C # i .NET.
Rozważmy na przykład artykuł MSDN na temat Cω , który mówi:
Przynajmniej o ile wiem, operatory oparte na XPath nigdy nie zostały dodane do C #, pozostawiając tylko te operatory, które zostały udokumentowane (zanim istniał LINQ) jako oparte bezpośrednio na SQL.
Teraz z pewnością jest prawdą, że LINQ nie jest identyczny z operatorami zapytań opartymi na SQL w Cω. W szczególności LINQ podąża za podstawowymi obiektami i wywołaniami funkcji języka C # znacznie bardziej niż Cω. Zapytania Cω podążały za składnią SQL jeszcze ściślej, więc możesz napisać coś takiego (ponownie, zaczerpnięte bezpośrednio z artykułu, do którego link znajduje się powyżej):
I tak, ten sam artykuł mówi konkretnie o używaniu zapytań opartych na SQL do zapytania danych pochodzących z rzeczywistych baz danych SQL:
Tak, tak, od samego początku (lub nawet przed początkiem, w zależności od twojego punktu widzenia) LINQ był wyraźnie oparty na SQL i miał na celu umożliwienie dostępu do danych w bazach danych SQL.
źródło
for
pętle, a Haskell wygląda jak imperatywne bloki kodu w stylu C, a więc Scala nazywa swoją operację monadycznąflatMap
, a Haskell nazywa toreturn
z tego samego powodu: aby dopasować się do „iluzji” uniemożliwiającej (byli) programiści imperatywni.Metody LINQ w .Net
zostały nazwane, aby były spójne ze składnią zapytania LINQ w C # (i VB.NET)
który został zaprojektowany, aby być zaznajomionym z osobami znającymi SQL
źródło
Dla mnie Select and Aggregate ma większy sens. Ponieważ jednostka staje się dominującą metodą kwerend i danych w .Net, Linq jest coraz częściej wykorzystywany przez programistów, którzy prawdopodobnie są przyzwyczajeni do pracy z danymi przez SQL. Używanie słów takich jak „Wybierz” ma dla tych programistów więcej sensu, ponieważ są to słowa kluczowe, do których są przyzwyczajeni.
źródło
INNER JOIN
jeden dzień, gdy Entity Framework nie byłaby opcją. Prawdopodobnie wręcz przeciwnie. Coraz więcej osób korzysta z LINQ codziennie, którzy aktywnie unikają pisania SQL. Ludzie, którzy znają się na SQL, prawdopodobnie robią więcej w SQL.