Je sais que je peux aller encore plus loin pour charger les données associées à l'aide de ThenInclude dans Eager Loading comme dans l'exemple ci-dessous

//Eager Loading
var publisher = await _context.Publishers
                              .Include(pub => pub.Books)
                                  .ThenInclude(book => book.Sales)
                              .Include(pub => pub.Users)
                              .Where(pub => pub.PubId == id)
                              .FirstOrDefaultAsync();

Comment puis-je écrire la même requête en chargement explicite ? Comment charger des données pour Sales sans parcourir les livres dans le cas ci-dessous ?

//Explicit Loading
var publisher = await _context.Publishers
                              .SingleAsync(pub => pub.PubId == id);

_context.Entry(publisher)
        .Collection(pub => pub.Books)
        .Load();
                 
_context.Entry(publisher)
        .Collection(pub => pub.Users)                
        .Load();
7
Curious Drive 24 févr. 2020 à 22:10

1 réponse

Meilleure réponse

Query() La méthode est votre amie.

C'est partiellement expliqué dans Interrogation des entités associées< /a> sous-section de Chargement explicite Documentation:

Vous pouvez également obtenir une requête LINQ qui représente le contenu d'une propriété de navigation.

Cela vous permet, par exemple, d'exécuter un opérateur d'agrégat sur les entités associées sans les charger en mémoire.

Exemple...

Vous pouvez également filtrer les entités associées chargées en mémoire.

Exemple...

Ce qu'ils ont oublié de mentionner, c'est que vous pouvez également l'utiliser pour les données liées Include / ThenInclude des données de chargement explicite.

Par exemple.

_context.Entry(publisher)
    .Collection(pub => pub.Books)
    .Query() // <--
    .Include(book => book.Sales) // <--
    .Load();
12
Ivan Stoev 24 févr. 2020 à 19:31