Celem dostawcy Linq jest zasadniczo "przetłumaczenie" drzewek wyrażeń Linq (które są budowane za kulisami zapytania) na macierzysty język zapytania źródła danych. W przypadkach, gdy dane są już w pamięci, nie potrzebujesz dostawcy Linq; Obiekty Linq 2 są w porządku. Jeśli jednak używasz Linq do komunikowania się z zewnętrznym magazynem danych, takim jak DBMS lub chmura, jest to absolutnie niezbędne.
Podstawową przesłanką każdej struktury zapytań jest to, że silnik źródła danych powinien wykonywać jak najwięcej pracy i zwracać tylko te dane, które są potrzebne klientowi. Dzieje się tak, ponieważ zakłada się, że źródło danych najlepiej wie, jak zarządzać przechowywanymi danymi, a ponieważ transport danych w sieci jest stosunkowo drogi, należy go zminimalizować. Teraz w rzeczywistości ta druga część to "zwróć tylko dane żądane przez klienta"; serwer nie może odczytać umysłu twojego programu i wiedzieć, czego naprawdę potrzebuje; może dać tylko to, o co jest proszony. Oto, gdzie inteligentny dostawca Linq absolutnie wieje "naiwne" wdrożenie. Używając strony IQueryable Linq, która generuje drzewa ekspresji, dostawca Linq może przetłumaczyć drzewo ekspresji na, powiedzmy, instrukcję SQL, którą DBMS użyje do zwrócenia rekordów, o które prosił klient w instrukcji Linq. Naiwna implementacja wymagałaby pobrania WSZYSTKICH rekordów za pomocą jakiejś szerokiej instrukcji SQL, w celu dostarczenia klientowi listy obiektów znajdujących się w pamięci, a następnie cała praca związana z filtrowaniem, grupowaniem, sortowaniem itp. Jest wykonywana przez klienta.
Załóżmy na przykład, że używasz Linq, aby uzyskać rekord z tabeli w DB za pomocą klucza głównego. Dostawca Linq mógłby przetłumaczyć dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()
na "SELECT TOP 1 * z MyObjectTable WHERE Id = 1234". To zwraca zero lub jeden rekord."Naiwna" implementacja prawdopodobnie wyśle serwerowi zapytanie "SELECT * FROM MyObjectTable", a następnie skorzystaj z IEnumerable strony Linq (która działa na klasach w pamięci), aby wykonać filtrowanie. W oświadczeniu, które spodziewasz się uzyskać wyniki 0-1 z tabeli z 10 milionami rekordów, które z nich mogłoby zrobić to zadanie szybciej (lub nawet pracować w ogóle, bez wyczerpania pamięci)?
Nie wiem, dlaczego linq-to-excel korzysta z IQueryable, ale zdarzają się przypadki, w których kod jest znacznie szybszy. – CodesInChaos