Avatar ·

Retourner IEnumerable<T> ou IQueryable<T> en C# : quelle est la différence et que choisir ?

Bonjour à tous ! Je suis un développeur C# débutant, je travaille avec Entity Framework et LINQ. Je vois souvent dans le code de mes collègues qu'ils retournent tantôt `IEnumerable`, tantôt `IQueryable`. Au début, je pensais que c'était interchangeable, mais ensuite j'ai remarqué un comportement étrange. Voici un exemple. J'ai une méthode qui récupère la liste des commandes : ```csharp public IEnumerable GetOrders() { using (var db = new MyDbContext()) { return db.Orders.Where(o => o.IsActive); } } ``` Ensuite, je l'appelle et applique un filtrage supplémentaire : ```csharp var orders = GetOrders().Where(o => o.Total > 100).ToList(); ``` Je m'attendais à ce qu'une seule requête SQL avec deux conditions (`IsActive = true AND Total > 100`) soit envoyée à la base de données, mais le profileur montre que d'abord toutes les commandes actives sont sélectionnées, puis le filtrage par `Total` se fait en mémoire dans l'application ! C'est extrêmement lent s'il y a beaucoup de commandes. Et si je change le type de retour en `IQueryable`, tout fonctionne comme prévu — le SQL généré