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é
No answers yet.
Connectez-vous pour laisser une réponse
Blogs