Sobes.tech
Middle

Šta je IQueryable u kontekstu C#?

sobes.tech АИ

Одговор од АИ

IQueryable<T> представља интерфејс у LINQ-у који омогућава креирање и извршавање упита на изворима података који подржавају одложену процену и могућност изградње дрвета израза.

Кључне особине:

  • Одложена процена: Упит се не извршава одмах при креирању, већ тек када је потребно добити резултате (нпр. при итерацији кроз колекцију или позиву ToList(), ToArray()).
  • Древо израза: Упит је представљен као дрво израза (Expression<Func<T>>), које се може анализирати и трансформисати у нешто што извор података разуме (нпр. SQL упит за базу података).
  • Филтрирање и пројекција на страни извора података: Захваљујући дрвету израза, операције филтрирања (Where), сортирања (OrderBy) и пројекције (Select) могу бити извршене на страни извора података, што значајно повећава перформансе, посебно при раду са великим количинама података.

Разлике од IEnumerable<T>:

Карактеристика IEnumerable<T> IQueryable<T>
Процена Одмах/одложена (зависи од извора) Одложена
Извлачење података Цела колекција може бити учитана у меморију Учитавају се само потребни подаци након извршења
Где се извршава филтрирање/пројекција У меморији апликације На страни извора података
Основа Колекције у меморији, низови Извори података (базе података, веб сервиси итд.)
Подршка израза Не (користи делегате Func<T>) Да (користи дрвета израза Expression<Func<T>>)

Пример употребе:

using System.Linq;
using System.Collections.Generic;

// Замислите да је ово извор података који подржава 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()
    {
        // У стварности, ово би била позив на базу података или други извор
        return people.AsQueryable();
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// Коришћење
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // Креирање упита са IQueryable - упит још није извршен
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Извршавање упита при итерацији
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Извршавање упита при претварању у листу
        List<Person> seniors = query.ToList();
    }
}