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