Sobes.tech
Middle

Jak określić, kiedy używać IQueryable zamiast IEnumerable w kodzie?

sobes.tech AI

Odpowiedź od AI

Używaj IQueryable, gdy konieczne jest wykonywanie złożonych zapytań do źródła danych (np. bazy danych) z opóźnionym wykonaniem. Pozwala to dostawcy IQueryable na tłumaczenie wyrażeń LINQ na odpowiedni język zapytań (np. SQL), optymalizując pobieranie danych.

Używaj IEnumerable, gdy źródło danych jest już w pamięci lub gdy zapytanie jest wykonywane lokalnie (np. filtrowanie listy obiektów). IEnumerable działa na kolekcjach obiektów w pamięci.

Kluczowe różnice:

Cecha IEnumerable IQueryable
Gdzie wykonywane jest zapytanie W pamięci klienta. Po stronie źródła danych.
Wydajność Mniej wydajne dla dużych zbiorów danych, ponieważ najpierw pobiera się cały zbiór, a następnie filtruje w pamięci. Bardziej wydajne dla dużych zbiorów danych, ponieważ zapytanie jest optymalizowane i wykonywane po stronie źródła, pobierając tylko potrzebne dane.
Funkcje Obsługuje LINQ to Objects. Obsługuje LINQ to SQL/Entities i innych dostawców IQueryable.
Opóźnione wykonanie Tak, ale przetwarzanie danych odbywa się w pamięci. Tak, dostawca zapytań buduje drzewo wyrażeń i wykonuje zapytanie na źródle danych.

Przykład użycia IQueryable z Entity Framework Core:

// Załóżmy, że context to DbContext Entity Framework
var query = context.Products
                   .Where(p => p.Price > 100)
                   .OrderBy(p => p.Name)
                   .Select(p => p.Name); // Zapytanie jest budowane, ale nie wykonywane

// Zapytanie jest wykonywane dopiero przy enumeracji (np. wywołanie ToList)
var nazwyProduktów = query.ToList();

Przykład użycia IEnumerable po pobraniu danych:

// Załóżmy, że products to już kolekcja IEnumerable<Product> w pamięci
IEnumerable<Product> products = GetProductsFromCache(); // Lub inna operacja zwracająca dane w pamięci

var przefiltrowaneProdukty = products.Where(p => p.Category == "Electronics"); // Filtracja odbywa się w pamięci