1. ホーム
  2. asp.net-core-mvc

[解決済み] 第二階層に複数のリファレンスを含める

2022-08-15 08:43:47

質問

このようなモデルがあるとします。

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テーブルから...と、1つの命令でデータを取得したいと思います。Include/ThenInclude APIを使えば、次のようなことが書けます。

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

しかし、Titreプロパティの後に、TypeContact、Language、Fonctionなどの他の参照をインクルードすることができません... IncludeメソッドはTiersオブジェクトを提案し、ThenIncludeはTitreオブジェクトを提案しますが、Contactオブジェクトは提案しません。どうすれば、Contactのリストからすべてのリファレンスをインクルードできるのでしょうか?1つの命令でこれを達成することができますか?

どのように解決するのですか?

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