Middle
Ce este IQueryable în contextul C#?
sobes.tech AI
Răspuns de la AI
IQueryable<T> este o interfață în LINQ care permite construirea și executarea de interogări către o sursă de date care suportă evaluarea întârziată și capacitatea de a construi un arbore de expresii.
Caracteristici cheie:
- Evaluare întârziată: Interogarea nu se execută imediat la construirea sa, ci doar atunci când este necesar să se obțină rezultatele (de exemplu, la iterarea peste colecție sau apelarea
ToList(),ToArray()). - Arbore de expresii: Interogarea este reprezentată sub formă de arbore de expresii (
Expression<Func<T>>), care poate fi analizat și transformat în ceva ce sursa de date poate înțelege (de exemplu, o interogare SQL pentru o bază de date). - Filtrare și proiecție pe partea sursei de date: Datorită arborelui de expresii, operațiunile de filtrare (
Where), sortare (OrderBy) și proiecție (Select) pot fi efectuate pe partea sursei de date, ceea ce crește semnificativ performanța, mai ales când se lucrează cu volume mari de date.
Diferențe față de IEnumerable<T>:
| Caracteristică | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Evaluare | Imediată/Întârziată (depinde de sursă) | Întârziată |
| Extracția datelor | Întreaga colecție poate fi încărcată în memorie | Se încarcă doar datele necesare după executare |
| Unde se face filtrarea/proiecția | În memorie aplicației | Pe partea sursei de date |
| Bază | Colecții în memorie, array-uri | Surse de date (baze de date, servicii web etc.) |
| Suport pentru expresii | Nu (folosește delegați Func<T>) |
Da (folosește arbori de expresii Expression<Func<T>>) |
Exemplu de utilizare:
using System.Linq;
using System.Collections.Generic;
// Presupunem că aceasta este o sursă de date care suportă 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()
{
// Într-o situație reală, aceasta ar fi o interogare la o bază de date sau altă sursă
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Utilizare
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Crearea unei interogări cu IQueryable - interogarea nu a fost încă executată
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Executarea interogării la iterare
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Executarea interogării la conversia în listă
List<Person> seniors = query.ToList();
}
}