Sobes.tech
Middle

Ako určiť, kedy použiť IQueryable namiesto IEnumerable v kóde?

sobes.tech AI

Odpoveď od AI

Používajte IQueryable, keď je potrebné vykonávať zložité dotazy na zdroj dát (napríklad databázu) s oneskoreným vykonaním. To umožňuje poskytovateľovi IQueryable prekladať LINQ výrazov do príslušného jazyka dotazov (napríklad SQL), čím optimalizuje výber dát.

Používajte IEnumerable, keď je zdroj dát už v pamäti alebo keď sa dotaz vykonáva lokálne (napríklad filtrovanie zoznamu objektov). IEnumerable pracuje so zbierkami objektov v pamäti.

Kľúčové rozdiely:

Prvok IEnumerable IQueryable
Kde sa vykonáva dotaz V pamäti klienta. Na strane zdroja dát.
Výkon Menej efektívne pre veľké množstvá dát, pretože najskôr sa načíta celý súbor a potom sa filtruje v pamäti. Efektívnejšie pre veľké množstvá dát, pretože dotaz je optimalizovaný a vykonáva sa na strane zdroja, načítavajú sa len potrebné údaje.
Možnosti Podporuje LINQ to Objects. Podporuje LINQ to SQL/Entities a ďalších poskytovateľov IQueryable.
Oneskorené vykonanie Áno, ale spracovanie dát prebieha v pamäti. Áno, poskytovateľ dotazu stavia strom výrazov a vykonáva dotaz na zdroji dát.

Príklad použitia IQueryable s Entity Framework Core:

// Predpokladajme, že context je DbContext Entity Framework
var query = context.Products
                   .Where(p => p.Price > 100)
                   .OrderBy(p => p.Name)
                   .Select(p => p.Name); // Dotaz sa stavia, ale nevyhodnocuje

// Dotaz sa vykoná až pri prechádzaní (napríklad volanie ToList)
var productNames = query.ToList();

Príklad použitia IEnumerable po získaní dát:

// Predpokladajme, že products je už kolekcia IEnumerable<Product> v pamäti
IEnumerable<Product> products = GetProductsFromCache(); // Alebo iná operácia, ktorá vráti dáta do pamäti

var filteredProducts = products.Where(p => p.Category == "Electronics"); // Filtrovanie prebieha v pamäti