2009-07-09 9 views

Odpowiedz

79

AsQueryable tworzy zapytanie, instrukcje potrzebne do uzyskania listy. Możesz później wprowadzić dalsze zmiany w zapytaniu, na przykład dodając nowe klauzule Where, które zostaną wysłane w całości do poziomu bazy danych.

AsList zwraca rzeczywistą listę ze wszystkimi przedmiotami w pamięci. Jeśli dodasz do niego nowe polecenie, nie uzyskasz szybkiego filtrowania zapewnianego przez bazę danych. Zamiast tego otrzymujesz wszystkie informacje z listy, a następnie odfiltrowujesz to, czego nie potrzebujesz w aplikacji.

W zasadzie sprowadza się do czekania do ostatniego możliwego okresu przed zobowiązaniem się.

+4

zgadzam się, ale pamiętaj, że poza "szybkim filtrowaniem", istnieje również hit przesyłania wszystkich informacji przez sieć. – eglasius

+0

Ponadto, nie jest to jedyny sposób, aby to zrobić, ponieważ u można otrzymać filtry do zastosowania zamiast zwracania czegoś, co można filtrować. Pierwsza jest łatwiejsza w użyciu, jeśli później zmienisz korzystanie z db na coś innego, np. Usługę internetową lub cokolwiek innego. – eglasius

+10

Kolejny punkt: jeśli zwrócisz IQueryable, musisz znaleźć dobry sposób, aby upewnić się, że 1.) kontekst jest otwarty do momentu wykonania kwerendy i 2.), że kontekst zostanie poprawnie usunięty. Zwrócenie listy ma tę zaletę, że można kontrolować czas życia kontekstu wewnątrz metody. To, co lepiej pasuje, zależy od rzeczywistych wymagań. –

4

Powracanie IQueryable<T> wstrzyma wykonanie zapytania, dopóki jego wyniki nie zostaną faktycznie użyte. Do tego czasu można również wykonywać dodatkowe operacje na zapytaniach do bazy danych pod adresem IQueryable<T>; na List jesteś ograniczony do ogólnie mniej wydajnych operacji w pamięci.

+0

Myślę, że to właśnie powiedział Grauenwolf: P :) – eglasius

+0

Jego odpowiedź została złożona podczas pisania mojego. :) – dahlbyk

19

Powracanie IQueryable<T> ma tę zaletę, że wykonanie jest wolniejsze, dopóki naprawdę 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żna kontrolować czasu życia kontekstu bazy danych w tej metodzie - potrzebny jest otwarty kontekst i musi on pozostać otwarty do czasu wykonania kwerendy. A następnie musisz upewnić się, że kontekst zostanie usunięty. Jeśli zwrócisz wynik jako List<T>, T[] lub coś podobnego, stracisz wykonanie i wykonanie po stronie serwera złożonych zapytań, ale wygrasz kontrolę nad czasem istnienia kontekstu bazy danych.

To, co najlepiej pasuje, zależy oczywiście od rzeczywistych wymagań. To kolejne pytanie bez jednej prawdy.

9

AsQueryable jest metoda rozszerzenie dla IEnumerable<T> że może zrobić dwie rzeczy:

  • Jeśli IEnumerable<T> narzędzia IQueryable<T> justs odlewane, nic nie robiąc.
  • W przeciwnym razie tworzy "fałszywy" IEnumerable<T> (EnumerableQuery<T>), który implementuje każdą metodę kompilacji lambdas i wywoływania metod rozszerzenia Enumerable.

Tak więc w większości przypadków z wykorzystaniem AsQueryable jest bezużyteczne, chyba że u są zmuszeni przekazać IQueryable sposobu i u mają IEnumerable zamiast, to hack.

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

+2

AsQueryable nie jest bezużyteczny, ponieważ przypadek "state to pass as IQueryable" jest prawidłowy, pozwala ci użyć tego, co oferuje IQueryable, a to jest więcej niż IEnumerable. Nie uważam tego za hack i ma swoje zastosowania, zobacz na przykład tutaj: http://wcf.codeplex.com/wikipage?title=Getting%20started:%20Building%20a%20simple%20web%20api. Ale domyślam się, że nie można go użyć, by wejść głębiej i wpłynąć na to, jak powstają dane zmienne (na przykład optymalizując zapytanie), ale będzie działał tylko nad tym, co zostanie stworzone. –

+0

IQueryable i AsQueryable właśnie uratowały moje życie –

Powiązane problemy