Sobes.tech
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();
    }
}