Middle
Cos'è IQueryable nel contesto di C#?
sobes.tech AI
Risposta dell'AI
IQueryable<T> è un'interfaccia in LINQ che consente di costruire ed eseguire query su una fonte di dati che supporta la valutazione differita e la capacità di costruire un albero di espressioni.
Caratteristiche principali:
- Valutazione differita: La query non viene eseguita immediatamente al momento della sua creazione, ma solo quando è necessario ottenere i risultati (ad esempio, durante l'iterazione sulla collezione o chiamando
ToList(),ToArray()). - Albero di espressioni: La query è rappresentata sotto forma di un albero di espressioni (
Expression<Func<T>>), che può essere analizzato e trasformato in qualcosa di comprensibile per la fonte di dati (ad esempio, una query SQL per un database). - Filtraggio e proiezione lato fonte di dati: Grazie all'albero di espressioni, le operazioni di filtraggio (
Where), ordinamento (OrderBy) e proiezione (Select) possono essere eseguite lato fonte di dati, migliorando notevolmente le prestazioni, specialmente quando si lavora con grandi volumi di dati.
Differenze rispetto a IEnumerable<T>:
| Caratteristica | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Valutazione | Immediata/Retardata (dipende dalla fonte) | Tardiva |
| Estrazione dati | L'intera collezione può essere caricata in memoria | Vengono caricati solo i dati necessari dopo l'esecuzione |
| Dove avviene il filtraggio/proiezione | In memoria dell'applicazione | Sul lato fonte di dati |
| Base | Collezioni in memoria, array | Fonti di dati (database, servizi web, ecc.) |
| Supporto espressioni | No (usa delegati Func<T>) |
Sì (usa alberi di espressioni Expression<Func<T>>) |
Esempio di utilizzo:
using System.Linq;
using System.Collections.Generic;
// Supponiamo che questa sia una fonte di dati che supporta 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()
{
// In una situazione reale, questo sarebbe una query a un database o altra fonte
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Utilizzo
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Creazione di una query con IQueryable - la query non è ancora eseguita
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Esecuzione della query durante l'iterazione
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Esecuzione della query convertendola in una lista
List<Person> seniors = query.ToList();
}
}