Sobes.tech
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