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