Sobes.tech
Middle

Qu'est-ce que IQueryable dans le contexte de C#?

sobes.tech IA

Réponse de l'IA

IQueryable<T> est une interface dans LINQ qui permet de construire et d'exécuter des requêtes vers une source de données prenant en charge l'évaluation différée et la capacité de construire un arbre d'expressions.

Caractéristiques clés :

  • Évaluation différée : La requête n'est pas exécutée immédiatement lors de sa construction, mais uniquement lorsque les résultats sont nécessaires (par exemple, lors de l'itération sur la collection ou en appelant ToList(), ToArray()).
  • Arbre d'expressions : La requête est représentée sous forme d'un arbre d'expressions (Expression<Func<T>>), qui peut être analysé et transformé en quelque chose de compréhensible pour la source de données (par exemple, une requête SQL pour une base de données).
  • Filtrage et projection côté source de données : Grâce à l'arbre d'expressions, les opérations de filtrage (Where), de tri (OrderBy) et de projection (Select) peuvent être effectuées côté source de données, ce qui augmente considérablement la performance, surtout lors du traitement de grands volumes de données.

Différences avec IEnumerable<T> :

Caractéristique IEnumerable<T> IQueryable<T>
Évaluation Immédiate/Retardée (dépend de la source) Différée
Extraction de données Toute la collection peut être chargée en mémoire Seules les données nécessaires sont chargées après exécution
Où la filtration/projection s'effectue En mémoire de l'application Côté source de données
Base Collections en mémoire, tableaux Sources de données (bases de données, services web, etc.)
Support des expressions Non (utilise des délégués Func<T>) Oui (utilise des arbres d'expressions Expression<Func<T>>)

Exemple d'utilisation :

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

// Supposons que ceci est une source de données supportant 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()
    {
        // Dans une situation réelle, cela serait une requête à une base de données ou une autre source
        return people.AsQueryable();
    }
}

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

// Utilisation
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // Création d'une requête avec IQueryable - la requête n'est pas encore exécutée
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Exécution de la requête lors de l'itération
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Exécution de la requête lors de la conversion en liste
        List<Person> seniors = query.ToList();
    }
}