Po co używać asqueryable () zamiast List()?

Zaczynam używać wzorca repozytorium dla dostępu do danych z Entity Framework I LINQ jako podstawy implementacji non-testowego repozytorium. Większość próbek, które widzę zwraca asqueryable (), gdy wywołanie zwraca N rekordów zamiast List . Jaka jest z tego korzyść?

Author: Peter Mortensen, 2009-07-10

4 answers

AsQueryable tworzy tylko zapytanie, instrukcje potrzebne do uzyskania listy. Możesz wprowadzić dalsze zmiany w zapytaniu później, takie jak dodanie nowych klauzul Where, które są wysyłane aż do poziomu bazy danych.

Aslist zwraca aktualną listę ze wszystkimi elementami w pamięci. Jeśli dodasz do niego nowy Where cluse, nie otrzymasz szybkiego filtrowania zapewnianego przez bazę danych. Zamiast tego otrzymujesz wszystkie informacje z listy, a następnie odfiltrowujesz to, czego nie potrzebujesz w aplikacji.

Więc zasadniczo sprowadza się to do czekania do ostatniej możliwej momencji przed popełnieniem siebie.

 85
Author: Jonathan Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 22:41:48

Zwracanie IQueryable<T> ma tę zaletę, że wykonanie jest defferer, dopóki nie zaczniesz wyliczać wyniku i możesz skomponować zapytanie z innymi zapytaniami i nadal uzyskać wykonanie po stronie serwera.

Problem polega na tym, że nie możesz kontrolować czasu życia kontekstu bazy danych w tej metodzie - potrzebujesz otwartego kontekstu i musisz upewnić się, że pozostanie on otwarty do czasu wykonania zapytania. A potem musisz upewnić się, że kontekst zostanie usunięty. Jeśli zwrócisz wynik jako List<T>, T[], lub coś podobnego, tracisz deffered execution i server side execution złożonych zapytań, ale zyskujesz kontrolę nad żywotnością kontekstu bazy danych.

To, co pasuje najlepiej, oczywiście zależy od rzeczywistych wymagań. To kolejne pytanie bez jednej prawdy.
 22
Author: Daniel Brückner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 23:17:17

AsQueryable jest metodą rozszerzenia dla IEnumerable<T>, która może zrobić dwie rzeczy:

  • Jeśli IEnumerable<T> implementuje IQueryable<T> justs rzuca, nic nie robi.
  • inaczej tworzy "fake' IEnumerable<T> (EnumerableQuery<T>) implementuje każdą metodę kompilującą lambda i wywołującą metody Enumerable extension.

Więc w większości przypadków używanie AsQueryable jest bezużyteczne, chyba że u są zmuszeni przekazać IQueryable do metody i zamiast tego masz IEnumerable, jest to hack.

Uwaga: AsQueryable to hack, IQueryable oczywiście nie jest!

 9
Author: Olmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-04 12:08:31

Zwrócenie IQueryable<T> odroczy wykonanie zapytania do czasu rzeczywistego użycia jego wyników. Do tego czasu możesz również wykonywać dodatkowe operacje zapytań do bazy danych na IQueryable<T>; na {[2] }jesteś ograniczony do ogólnie mniej wydajnych operacji w pamięci.

 4
Author: dahlbyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 22:46:56