2012-02-12 8 views

Odpowiedz

20

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.

+0

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. –

0

nie jestem zaznajomiony z infeasability z IQueryable, ale this blog post wydaje się wskazywać, że IQueryable jest o wiele bardziej korzystne, ponieważ IEnumerable IQueryable umożliwia dostęp do podstawowej wyrazu.

Może to mieć znaczenie tylko w przypadku klauzuli Where, a nie wpływu .Count().