Quand utiliser Include in EF? Pas nécessaire en projection?

entity-framework entity-framework-core

Question

J'ai les éléments suivants dans 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; }
}

Et j'ai la requête linq suivante:

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();

Je n'avais pas besoin d' inclure le thème pour que cela fonctionne, par exemple:

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

Quand aurai-je besoin d'utiliser Inclure dans Entity Framework?

METTRE À JOUR

J'ai ajouté une colonne de type Byte [] Illustration in Theme. Dans ma projection, je n'inclus pas cette colonne. Elle sera donc chargée si j'utilise Include? Ou n'est jamais chargé à moins que je l'aie dans la projection?

Réponse acceptée

Vous n'aviez pas besoin de l'option Include car vous travailliez dans le contexte EF. Lorsque vous faites référence à Theme dans l'objet anonyme que vous créez, cela n'utilise pas de chargement paresseux, mais indique à EF d'effectuer une jointure.

Si vous renvoyez une liste de livres et que vous n'incluez pas les thèmes, vous remarquerez que le thème est nul. Si la connexion EF est ouverte et que le chargement est différé, il ira dans la base de données et le récupérera pour vous. Mais, si la connexion n'est pas ouverte, vous devez l'obtenir explicitement.

Par contre, si vous utilisez Inclure, vous obtenez immédiatement les données. Sous le capot, il va faire un JOIN à la table nécessaire et obtenir les données juste là.

Vous pouvez vérifier la requête SQL générée par EF pour vous et rendre les choses plus claires pour vous. Vous verrez qu'une seule requête SQL.


Réponse populaire

Si vous Include un enfant, il est chargé dans la requête d'origine, ce qui la rend plus grande.

Si vous Include ou faites référence à l'enfant d'une autre manière dans la requête, la première est plus petite ResultSet, mais chaque enfant de référence que vous chargerez plus tard paresseux à travers une nouvelle demande à la base de données.

Si vous boucle par 1000 utilisateurs dans une requête, puis demander leurs 10 photos chacun, vous ferez 1001 demandes de base de données si vous Include l'enfant ...

En outre, le chargement paresseux nécessite que le contexte n'ait pas été éliminé. C'est toujours une surprise désagréable lorsque vous transmettez une entité à une vue pour un rendu d'interface utilisateur, par exemple.

update Essayez ceci par exemple et voyez son échec:

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

Alors essayez ceci:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow