web-dev-qa-db-fra.com

Inclure plusieurs références au deuxième niveau

Supposons que nous ayons ce modèle:

public class Tiers
{
    public List<Contact> Contacts { get; set; }
}

et

public class Contact
{
    public int Id { get; set; }
    public Tiers Tiers { get; set; }
    public Titre Titre { get; set; }
    public TypeContact TypeContact { get; set; }
    public Langue Langue { get; set; }
    public Fonction Fonction { get; set; }
    public Service Service { get; set; }
    public StatutMail StatutMail { get; set; }
}

Avec EF7, je voudrais récupérer toutes les données de la table Tiers, avec les données de la table Contact, de la table Titre, de la table TypeContact et ainsi de suite ... avec une seule instruction. Avec l'API Include/ThenInclude, je peux écrire quelque chose comme ceci:

_dbSet
     .Include(tiers => tiers.Contacts)
          .ThenInclude(contact => contact.Titre)
     .ToList();

Mais après la propriété Titre, je ne peux pas inclure d'autres références comme TypeContact, Langue, Fonction ... La méthode Include suggère un objet Tiers, et ThenInclude suggère un objet Titre, mais pas un objet Contact. Comment puis-je inclure toutes les références de ma liste de contacts? Pouvons-nous y parvenir avec une seule instruction?

66

.ThenInclude() enchaînera soit la dernière .ThenInclude() ou la dernière .Include() (la plus récente des deux) pour tirer plusieurs niveaux. Pour inclure plusieurs frères et sœurs au même niveau, utilisez simplement une autre chaîne .Include(). Un formatage correct du code peut considérablement améliorer la lisibilité.

_dbSet
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.Titre)
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.TypeContact)
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.Langue);
    // etc.
112
bricelam

Par souci d'exhaustivité:

Il est également possible d'inclure des propriétés imbriquées directement via Includeau cas où ce ne sont pas des propriétés de collection comme ceci:

_dbSet
    .Include(tier => tier.Contact.Titre)
    .Include(tier => tier.Contact.TypeContact)
    .Include(tier => tier.Contact.Langue);
1
Risadinha