Supongamos que tenemos este modelo:
public class Tiers
{
public List<Contact> Contacts { get; set; }
}
y
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; }
}
Con EF7 me gustaría recuperar todos los datos de la tabla de niveles, con los datos de la tabla de contactos, de la tabla de títulos, de la tabla de contactos de tipo y así sucesivamente ... con una sola instrucción. Con Include / ThenInclude API puedo escribir algo como esto:
_dbSet
.Include(tiers => tiers.Contacts)
.ThenInclude(contact => contact.Titre)
.ToList();
Pero después de la propiedad Titre, no puedo incluir otras referencias como TypeContact, Langue, Fonction ... El método Include sugiere un objeto Tiers, y ThenInclude sugiere un objeto Titre, pero no un objeto Contact. ¿Cómo puedo incluir todas las referencias de mi lista de contactos? ¿Podemos lograr esto con una sola instrucción?
.ThenInclude()
encadenará la última. .ThenInclude()
o la última. .Include()
(la que sea más reciente) para acceder a múltiples niveles. Para incluir varios hermanos en el mismo nivel, solo use otra cadena .Include()
. El formato correcto del código puede mejorar drásticamente la legibilidad.
_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.
Por completo:
También es posible incluir propiedades anidadas directamente a través de Include
en caso de que no sean propiedades de colección de la siguiente manera:
_dbSet
.Include(tier => tier.Contact.Titre)
.Include(tier => tier.Contact.TypeContact)
.Include(tier => tier.Contact.Langue);