Middle
Čo je IQueryable v kontexte C#?
sobes.tech AI
Odpoveď od AI
IQueryable<T> predstavuje rozhranie v LINQ, ktoré umožňuje vytvárať a spúšťať dotazy na zdrojoch dát podporujúcich odložené vyhodnocovanie a konštrukciu stromov výrazov.
Kľúčové vlastnosti:
- Odložené vyhodnocovanie: Dotaz sa nespúšťa okamžite pri jeho vytvorení, ale až keď je potrebné získať výsledky (napríklad pri iterácii cez kolekciu alebo volaní
ToList(),ToArray()). - Strom výrazov: Dotaz je reprezentovaný ako strom výrazov (
Expression<Func<T>>), ktorý je možné analyzovať a previesť na niečo, čo zdroj dát pochopí (napríklad SQL dotaz pre databázu). - Filtrovanie a projekcia na strane zdroja dát: Vďaka stromu výrazov môžu byť operácie filtrovania (
Where), zoradenia (OrderBy) a projekcie (Select) vykonané na strane zdroja dát, čo výrazne zvyšuje výkon, najmä pri práci s veľkými objemami dát.
Rozdiely od IEnumerable<T>:
| Charakteristika | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Vyhodnocovanie | Okamžité/odložené (závisí od zdroja) | Odložené |
| Získavanie dát | Celá kolekcia môže byť načítaná do pamäte | Načítajú sa len potrebné dáta po spustení |
| Kde sa vykonáva filtrovanie/projekcia | V pamäti aplikácie | Na strane zdroja dát |
| Základ | Kolekcie v pamäti, polia | Zdrojové dáta (databázy, webové služby a pod.) |
| Podpora výrazov | Nie (používa delegáty Func<T>) |
Áno (používa stromové výrazy Expression<Func<T>>) |
Príklad použitia:
using System.Linq;
using System.Collections.Generic;
// Predpokladajme, že toto je zdroj dát podporujúci IQueryable
public class DataSource
{
private List<Person> people = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
public IQueryable<Person> GetPeople()
{
// V skutočnosti by to bola volanie na databázu alebo iný zdroj
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Použitie
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Vytvorenie dotazu s IQueryable - dotaz ešte nie je spustený
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Spustenie dotazu pri iterácii
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Spustenie dotazu pri konverzii na zoznam
List<Person> seniors = query.ToList();
}
}