Mam tabelę z 200 000 rekordów, gdzie otrzymuję tylko pierwszą 10 używając .Take()
, ale pobranie danych zajmuje około 10 sekund.Linq do encji jest bardzo powolny za pomocą metody .Take()
Moje pytanie brzmi: czy metoda .Take()
pobiera wszystkie dane z bazy danych i filtruje 10 najlepszych po stronie klienta?
Oto mój kod:
mylist = (from mytable in db.spdata().OrderByDescending(f => f.Weight)
group feed by mytable.id into g
select g.FirstOrDefault()).Take(10).ToList();
spdata()
jest funkcja importu z procedury przechowywanej.
Dzięki
Jeśli jesteś ciekawy, co działa na bazie należy zaczepić profilera do DB i sprawdź dzienniki, to najlepszy sposób, aby się tego dowiedzieć. – Chris
Jeśli spdata() zwróci 200 000, to tak, zrobi to po stronie klienta. –
Oprócz metody Chrisa można również wypróbować Linqpad i przełączyć się do widoku SQL po napisaniu zapytania, aby zobaczyć wygenerowany SQL, lub wstawić punkt przerwania (za pomocą tej metody http://stackoverflow.com/questions/1412863/how -do-i-view-the-sql-generated-by-the-entity-framework), aby zobaczyć, co jest generowane podczas wykonywania programu. –