Zostałeś wprowadzony w błąd.
IEnumerable
użyje Linq do obiektów, wszystkie metody są wykonywane na obiektach w pamięci. - IQueryable
będzie używać dowolnej implementacji metod rozszerzenia Linq przez określonego dostawcę. W tym przypadku (repozytorium) odgadłbym, że najprawdopodobniej dostawca mapuje wyrażenia Linq do instrukcji bazy danych.
Oznacza to, że jeśli używasz IQueryable
:
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
Ilość ustalana jest na samej bazy danych, to znaczy jako zapytanie "select count(*) from People"
. Zwykle jest to bardzo, bardzo szybkie.
Jeśli używasz IEnumerable
:
IEnumerable<People> list = repository.FindAllPeople;
int count = list.Count();
wszyscy ludzie przypadki zostaną zmaterializowane w pamięci jeden po drugim podczas LINQ do obiektów jest iteracja kolekcji w celu określenia liczby. Będzie to bardzo powolne i powinno się go unikać w miarę możliwości.
Ponieważ nie wszystkie wywołania metod może być odwzorowany do zapytań do bazy danych to czasami nieuniknione użycie IEnumerable
, ale filtrowanie, łączenie i grupowanie powinna być sporządzona na IQueryable, jeśli to możliwe, to w ostatnim kroku można użyć AsEnumerable()
metody rozszerzeń, aby przełączyć się na używanie IEnumerable
i Linq do obiektów.
Nie w moim przypadku liczba uruchomień na dokumencie programu Excel nie jest zbyt dobra dla wydajności. 300-400ms na około 350 rzędów. Dziękuję za wyjaśnienie. Pomógł mi zrozumieć, dlaczego jest tak powolny. –