Devolver IEnumerable<T> o IQueryable<T> en C#: cuál es la diferencia y qué elegir
¡Hola a todos! Soy un desarrollador C# principiante, trabajo con Entity Framework y LINQ. A menudo veo en el código de mis colegas que devuelven de los métodos a veces `IEnumerable`, a veces `IQueryable`. Al principio pensé que eran intercambiables, pero luego noté un comportamiento extraño.
Aquí hay un ejemplo. Tengo un método que obtiene una lista de pedidos:
```csharp
public IEnumerable GetOrders()
{
using (var db = new MyDbContext())
{
return db.Orders.Where(o => o.IsActive);
}
}
```
Luego lo llamo y aplico un filtrado adicional:
```csharp
var orders = GetOrders().Where(o => o.Total > 100).ToList();
```
Esperaba que a la base de datos se enviara una sola consulta SQL con dos condiciones (`IsActive = true AND Total > 100`), pero el profiler muestra que primero se seleccionan todos los pedidos activos, ¡y luego el filtrado por `Total` ocurre en la memoria de la aplicación! Esto es terriblemente lento si hay muchos pedidos.
Y si cambio el tipo de retorno a `IQueryable`, todo funciona como debería — en SQL se genera
No answers yet.
Inicia sesión para dejar una respuesta
Blogs