Używam wzorca repozytorium do dostępu do danych z Entity Framework i LINQ jako podstawą implementacji repozytorium niebędącego testem. Większość wyświetlanych próbek zwraca AsQueryable(), gdy wywołanie zwraca N rekordów zamiast listy < T>. Jaka jest korzyść z robienia tego?Dlaczego warto używać AsQueryable() zamiast List()?
Odpowiedz
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ę.
zgadzam się, ale pamiętaj, że poza "szybkim filtrowaniem", istnieje również hit przesyłania wszystkich informacji przez sieć. – eglasius
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
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ń. –
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.
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.
AsQueryable
jest metoda rozszerzenie dla IEnumerable<T>
że może zrobić dwie rzeczy:
- Jeśli
IEnumerable<T>
narzędziaIQueryable<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!
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. –
IQueryable i AsQueryable właśnie uratowały moje życie –
- 1. Czy warto używać list asocjacyjnych zamiast rekordów?
- 2. Dlaczego warto używać ROLAP zamiast zwykłego MySQL?
- 3. Dlaczego warto używać Celery zamiast RabbitMQ?
- 4. Dlaczego warto używać argparse zamiast optparse?
- 5. Dlaczego warto używać spyOn zamiast jaśminu.createSpy?
- 6. Dlaczego warto używać var zamiast nazwy klasy?
- 7. Dlaczego warto używać metody classmethod zamiast staticmethod?
- 8. Dlaczego warto używać Long.valueOf (...) zamiast długiego literału?
- 9. Dlaczego warto używać Function.prototype.bind zamiast Function.prototype.call?
- 10. Dlaczego NumPy zamiast list Pythona?
- 11. Dlaczego warto używać NSAutoreleasePool?
- 12. Dlaczego warto używać Gradle?
- 13. Dlaczego warto używać shm_open?
- 14. Dlaczego warto używać niestandardowych zdarzeń zamiast bezpośrednich wywołań metod?
- 15. Dlaczego warto używać funkcji rbegin() zamiast końcówki() - 1?
- 16. Dlaczego warto używać TimeSpan.CompareTo() zamiast < > lub =
- 17. Dlaczego warto używać angularfire $ destroy()?
- 18. Dlaczego warto używać JIT UNITVERSIONING?
- 19. Dlaczego warto używać QObject :: setObjectName()?
- 20. Dlaczego warto używać AsynchronousFileChannel Java?
- 21. Dlaczego warto używać wzorca konstruktora?
- 22. Dlaczego warto używać aliasingów klas?
- 23. ReactJS: Dlaczego warto używać this.props.children?
- 24. Dlaczego warto używać wielu kontekstów OpenGL
- 25. Dlaczego warto użyć char [] zamiast ciągu?
- 26. Dlaczego używać krotek zamiast obiektów?
- 27. Dlaczego warto używać "succeed do" w Haml?
- 28. Dlaczego warto używać Ext.apply w initComponent
- 29. Dlaczego warto używać opcji Opcjonalnie.Opcji na Opcjonalne.Niewłączalne?
- 30. Dlaczego warto używać statycznego w D?
Co to jest repozytorium niebędące testem? –