Middle
Jak určit, kdy použít IQueryable místo IEnumerable v kódu?
sobes.tech AI
Odpověď od AI
Použijte IQueryable, když je třeba provádět složité dotazy na zdroji dat (například databázi) s odloženým vykonáním. To umožňuje poskytovateli IQueryable převést LINQ výrazy do odpovídajícího jazyka dotazu (například SQL), čímž optimalizuje načítání dat.
Použijte IEnumerable, když je zdroj dat již v paměti nebo když je dotaz prováděn lokálně (například filtrování seznamu objektů). IEnumerable pracuje s kolekcemi objektů v paměti.
Klíčové rozdíly:
| Vlastnost | IEnumerable | IQueryable |
|---|---|---|
| Kde je dotaz prováděn | V paměti klienta. | Na straně zdroje dat. |
| Výkon | Méně efektivní pro velké sady dat, protože nejprve se načte celý soubor a pak se filtruje v paměti. | Efektivnější pro velké sady dat, protože dotaz je optimalizován a provádí se na straně zdroje, načítajíc pouze potřebná data. |
| Funkce | Podporuje LINQ to Objects. | Podporuje LINQ to SQL/Entities a další poskytovatele IQueryable. |
| Odložené vykonání | Existuje, ale zpracování dat probíhá v paměti. | Existuje, poskytovatel dotazů vytváří strom výrazů a provádí dotaz na zdroji dat. |
Příklad použití IQueryable s Entity Framework Core:
// Předpokládejme, že context je DbContext Entity Framework
var dotaz = context.Products
.Where(p => p.Price > 100)
.OrderBy(p => p.Name)
.Select(p => p.Name); // Dotaz je sestaven, ale neproveden
// Dotaz se provede až při enumeraci (například voláním ToList)
var názvyProduktů = dotaz.ToList();
Příklad použití IEnumerable po získání dat:
// Předpokládejme, že products je již kolekce IEnumerable<Product> v paměti
IEnumerable<Product> products = GetProductsFromCache(); // Nebo jiná operace, která vrací data v paměti
var filtrovanéProdukty = products.Where(p => p.Category == "Electronics"); // Filtrace probíhá v paměti