web-dev-qa-db-fra.com

Entier Framework Core Eager Chargement puis inclusion dans une collection

J'ai trois modèles que je souhaite inclure lors de l'exécution d'une requête.

Voici le scénario.

public class Sale
{
     public int Id { get; set; }
     public List<SaleNote> SaleNotes { get; set; }
}

public class SaleNote
{
    public int Id { get; set; }
    public User User { get; set; }
}

public class User 
{
    public int Id { get; set; }
}

Je peux charger les SaleNotes comme ça ...

_dbContext.Sale.Include(s => s.SaleNotes);

Cependant, essayer de charger le modèle User à partir de SaleNote à l'aide de ThenInclude est difficile car il s'agit d'une collection. Je ne trouve aucun exemple sur la façon de charger ce scénario avec impatience. Quelqu'un peut-il fournir le code dans le ThenInclude suivant pour charger l'utilisateur pour chaque élément de la collection.

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);
24
Allen Rufolo

Peu importe que SaleNotes soit la propriété de navigation de la collection. Cela devrait fonctionner de la même manière pour les références et les collections:

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User);

Mais pour autant que je sache, EF7 prend également en charge l'ancienne syntaxe d'inclusion à plusieurs niveaux à l'aide de la méthode d'extension Select:

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User));
40
octavioccl

Pour référence, la dernière version d'EF Core (1.1.0) prend également en charge le chargement explicite pour ce scénario. Quelque chose comme ça...

using (var _dbContext = new DbContext())
{
    var sale = _dbContext.Sale
        .Single(s => s.Id == 1);

    _dbContext.Entry(sale)
        .Collection(n => n.SalesNotes)
        .Load();

    _dbContext.Entry(sale)
        .Reference(u => u.User)
        .Load();
}
5
Bandito