Entity Framework Tutorial Cuándo usar Incluir
¿Cuándo usar Include () con Entity Framework?
¿Cuándo usar Incluir con Entity Framework y está relacionado con la carga diferida?
Antes de saltar a la respuesta de cuándo usar Incluir, echemos un vistazo al siguiente ejemplo simple que contiene tres entidades.
La carga diferida es el proceso mediante el cual una entidad o colección de entidades se carga automáticamente desde la base de datos.
La carga diferida está habilitada de forma predeterminada en Entity Framework, y podemos marcar propiedades de navegación específicas o incluso entidades enteras como perezosas al hacerlas virtuales.
Ahora recuperemos todos los clientes de una base de datos y también repasemos sus facturas y luego imprimamos la fecha de la factura.
Si observa el SQL generado, verá que se ejecuta una consulta SQL para recuperar clientes y, a continuación, para cada cliente, se ejecuta otra consulta para recuperar las facturas relacionadas con ese cliente. Entonces, significa que si tiene 1000 clientes en su base de datos, EF ejecutará 1000 consultas para recuperar las facturas de esos 1000 clientes.
EF genera la siguiente consulta para recuperar clientes.
Y se genera la siguiente consulta para recuperar facturas de un cliente específico.
La carga perezosa es un gran mecanismo, pero solo si sabes cuándo y cómo usarlo.
Pero mira nuestro ejemplo otra vez. Ahora, si observa este ejemplo, verá el problema de selección de N + 1.
El problema está ocurriendo porque la carga diferida está habilitada de forma predeterminada y cuando estamos ejecutando una única consulta y luego N siguiendo las consultas (N es el número de entidades principales) para consultar algo.
La mejor manera de evitar el problema de seleccionar N + 1 en Entity Framework es utilizar el método Include. Creará una consulta con los datos necesarios utilizando la cláusula JOIN de SQL, que es más eficiente en comparación con la anterior.
Actualicemos nuestra consulta usando el método Include.
En el ejemplo anterior, le estamos diciendo a EF explícitamente que, además de los Clientes, también necesitamos sus Facturas. La siguiente es la consulta generada por SQL:
Como puede ver, Entity Framework ha usado la cláusula LEFT OUTER JOIN para obtener todos los datos necesarios. Otro punto importante es que el uso del método Include en el contexto que admite la carga diferida puede evitar el problema n + 1.