martes, 18 de octubre de 2016

Code Review: Refinar busquedas en Entity Framework

Haciendo un code review sobre un proyecto existente, encontre una implementacion similar a la siguiente, en la que se intenta refinar una busqueda en Entity Framework

            // Forma erronea de agregar criterios consultas
            IList<Cliente> clientes = context.Clientes.Where(c => c.Nombre.StartsWith("1")).ToList();
            if (filtrarSaldo)
                clientes = clientes.Where(c => c.Saldo > 1100).ToList();

En el codigo previo, al ejecutar el ToList() se esta realizando efectivamente la consulta contra la base de datos, trayendo todos los registros de la primer condicion, sin aplicar los filtros posteriors, refinamientos adicionales, se hacen sobre la coleccion que ya se encuentra en memoria

            // Forma correcta de agregar criterios
            IQueryable<Cliente> clientesQuery = context.Clientes.Where(c => c.Nombre.StartsWith("1"));
            if (filtrarSaldo)
                clientesQuery = clientesQuery.Where(c => c.Saldo > 1100);

En este ultimo ejemplo podemos ver la forma correcta de realizar el refinamiento, hasta el momento en que se intenta acceder a los datos, no se ejecuta la consulta contra la base de datos, que potencialmente traeria menos registros y se ejecutaria con mejor performance

En el siguiente enlace el codigo con un ejemplo completo en el que se puede ver el sql generado en cada caso

No hay comentarios:

Publicar un comentario