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