Sobes.tech
Junior — Middle

Jak odróżnić IEnumerable od IQueryable i w jakich przypadkach używać każdego z nich?

sobes.tech AI

Odpowiedź od AI

IEnumerable i IQueryable to interfejsy do pracy z kolekcjami, ale o różnych zachowaniach i przeznaczeniu:

  • IEnumerable<T> — służy do iteracji po kolekcjach w pamięci. Zapytania do danych są wykonywane natychmiast, a wszystkie operacje LINQ są przetwarzane po stronie klienta (w pamięci).

  • IQueryable<T> — rozszerza IEnumerable i pozwala na tworzenie zapytań, które mogą być przekształcone w wyrażenia, np. zapytania SQL. Wykonanie zapytania jest odłożone do momentu iteracji (leniwa realizacja), a operacje są wykonywane po stronie źródła danych (np. bazy danych).

Kiedy używać:

  • IEnumerable — jeśli dane są już załadowane do pamięci lub pracujesz z lokalnymi kolekcjami.
  • IQueryable — jeśli chcesz zbudować zapytanie do zdalnego źródła (bazy danych) i zoptymalizować wybór, wykonując filtrowanie i sortowanie na serwerze.

Przykład:

IQueryable<User> usersQuery = dbContext.Users.Where(u => u.Age > 18);
// Zapytanie do bazy danych zostanie sformułowane i wykonane podczas iteracji po usersQuery

IEnumerable<User> usersList = usersQuery.ToList();
// Dane są załadowane do pamięci, a dalsze operacje będą wykonywane lokalnie