在第二级包含多个引用

时间:2015-05-06 09:11:44

标签: asp.net-core-mvc entity-framework-core

假设我们有这个模型:

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

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; }
}

使用EF7,我想从Tiers表中检索所有数据,包括来自Contact表,Titre表,TypeContact表等的数据......只需一条指令。使用Include / ThenInclude API,我可以这样写:

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

但是在Titre属性之后,我不能包含其他引用,如TypeContact,Langue,Fonction ...... Include方法建议Tiers对象,ThenInclude建议Titre对象,但不是Contact对象。如何在联系人列表中包含所有引用?我们能用一条指令实现这个目标吗?

2 个答案:

答案 0 :(得分:104)

.ThenInclude()将链接最后.ThenInclude()或最后.Include()(以较新者为准)以拉入多个级别。要在同一级别包含多个兄弟,只需使用另一个.Include()链。正确格式化代码可以大大提高可读性。

_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.

答案 1 :(得分:1)

出于完整性考虑:

还可以直接通过Include包含嵌套属性,如果它们不是集合属性,则可以这样:

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