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ść?
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.
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.
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>
implementujeIQueryable<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!
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.
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