Avatar ·

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