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