¿Cuándo usar Incluir en EF? ¿No es necesario en proyección?

entity-framework entity-framework-core

Pregunta

Tengo lo siguiente en Entity Framework Core:

public class Book {
  public Int32 Id { get; set; }
  public String Title { get; set; }
  public virtual Theme Theme { get; set; }
}

public class Theme {
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public Byte[] Illustration { get; set; }
  public virtual ICollection<Ebook> Ebooks { get; set; }
}

Y tengo la siguiente consulta de linq:

List<BookModel> books = await context.Books.Select(x =>
  new BookModel {
    Id = x.Id,
    Name = x.Name,
    Theme = new ThemeModel {
      Id = x.Theme.Id,
      Name = x.Theme.Name
    }
   }).ToListAsync();

No tuve que incluir el tema para hacer este trabajo, por ejemplo:

List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ...

¿Cuándo necesitaré usar Incluir en Entity Framework?

ACTUALIZAR

Agregué una columna de tipo Byte [] Ilustración en tema. En mi proyección no estoy incluyendo esa columna, ¿se cargará si utilizo Incluir? ¿O nunca se carga a menos que lo tenga en la proyección?

Respuesta aceptada

No necesitó Incluir porque estaba trabajando dentro del contexto de EF. Cuando hace referencia al tema dentro del objeto anónimo que está creando, eso no está utilizando la carga perezosa, eso le dice a EF que haga una unión.

Si devuelve una lista de libros y no incluye los temas, cuando intente obtener el tema, notará que es nulo. Si la conexión EF está abierta y tiene una carga lenta, irá a la base de datos y la tomará por usted. Pero, si la conexión no está abierta, entonces hay que obtenerla explícitamente.

Por otro lado, si usa Incluir, obtiene los datos de inmediato. Debajo del capó hará una ÚNETE a la tabla necesaria y obtendrá los datos allí mismo.

Puedes verificar la consulta SQL que EF está generando para ti y eso te aclarará las cosas. Verás solo una consulta SQL.


Respuesta popular

Si Include un hijo, se carga como parte de la consulta original, lo que la hace más grande.

Si no Include o hace referencia al niño de alguna otra manera en la consulta, el conjunto de resultados inicial es más pequeño, pero cada niño al que haga referencia más tarde cargará perezosamente a través de una nueva solicitud a la base de datos.

Si recorre 1000 usuarios en una solicitud y luego pide sus 10 fotos cada una, hará 1001 solicitudes de base de datos si no Include al niño ...

Además, la carga lenta requiere que el contexto no se haya eliminado. Siempre es una sorpresa desagradable cuando pasa una Entidad a una vista para la representación de UI, por ejemplo.

actualizar Intente esto por ejemplo y véalo fallar:

var book = await context.Books.First();
var theme = book.Theme;

Entonces prueba esto:

var book = await context.Books.Include(b => b.Theme).First();
var theme = book.Theme;


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow