Hola a todos, en esta ocasión quiero alertar (o mejor recordar) sobre el riesgo del método GetAll() o mejor dicho, ese ToList() que se usa tanto en los controladores de Web API cómo en los de ASPNET MVC, generalmente se tiene algo cómo:



public class UsersController : ApiController
{
    private readonly AppContext db = new AppContext();

    public IEnumerable<User> GetUsers()
    {
        return db.Users;
    }
}

Y si revisamos los tutoriales de la página oficial:

alt

alt

Tanto en los demos de ASPNET MVC cómo en el de Web API se ve que siempre retornan todo el conjunto de datos existentes (aclaro que en la página los tutoriales están enfocados en conocer la tecnología), lo cual en un inicio puede que no tenga ningún problema, sin embargo, cuando llegamos a un ambiente productivo, o bien luego de un tiempo de tener la aplicación andando ese retorno de tan solo unos cuantos o miles de registros se pueden tornar en millones, y en ese momento es cuando vamos a tener problemas considerables de rendimiento. Y claro, no me digas que vas a mostrar más de 100000 registros en un tabla....


Para solucionar lo anterior, una solución inicial bastante sencilla es siempre limitar la cantidad de registros a retornar, y para este caso Linq nos facilita el trabajo gracias a la expresión Take(#registros), el cambio en el código es muy simple:


public class UsersController : ApiController
{
    private readonly AppContext db = new AppContext();

    public IEnumerable<User> GetUsers()
    {
        return db.Users.Take(1000);
    }
}

O bien implementar paginación en los resultados:

Así que cuidado en cómo exponemos los datos, podemos estar añadiendo problemas de performance y usabilidad a la aplicación que pronto estallará!

Saludos!