İkinci seviyeye birkaç referans ekleyin


93

Bu modele sahip olduğumuzu varsayalım:

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

ve

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 ile Tiers tablosundaki tüm verileri, Contact tablosundan, Titre tablosundan, TypeContact tablosundan vb. Tek bir talimatla almak istiyorum. Include / ThenInclude API ile şöyle bir şey yazabilirim:

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

Ancak Titre özelliğinden sonra, TypeContact, Langue, Fonction gibi diğer referansları ekleyemiyorum ... Include yöntemi bir Tiers nesnesi önerir ve ThenInclude bir Titre nesnesi önerir, ancak bir Contact nesnesi önerir. İletişim listemdeki tüm referansları nasıl ekleyebilirim? Bunu tek bir talimatla başarabilir miyiz?

Yanıtlar:


163

.ThenInclude()Birden çok seviyeye çekmek için sonuncudan .ThenInclude()veya sondan .Include()(hangisi daha yeniyse) zincirlenecektir . Aynı düzeyde birden çok kardeşi dahil etmek için başka bir .Include()zincir kullanın . Kodu doğru biçimlendirmek okunabilirliği büyük ölçüde artırabilir.

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

3
BTW, bu soru bana 2124
numaralı

neden olmasın: var contacts = _dbSet.Include(tiers => tiers.Contacts); contacts.ThenInclude(contact => contact.Titre); contacts.ThenInclude(contact => contact.TypeContact); contacts.ThenInclude(contact => contact.Langue); Bu işe yaramaz mı?
Doug

1
@Doug Hayır, Queryableher seferinde yeni nesneler yaratırsınız ve onları asla değerlendirmezsiniz. contactssadece ona atadığınız orijinal değere sahip olacaktır.
bricelam

2
Bu çözüm işe yarıyor, ancak sonuçta ortaya çıkan SQL ifadesi Kişiler ile üç LEFT JOIN ile sonuçlanıyor (en azından benim deneyimime göre). Bu son derece verimsiz. Daha iyi bir yol olmalı.
EL MOJO

3
Yeni arayanlar için: 2020'de EF Core 3.1 ile kabul edilen çözümle yaptığım test iyi çalıştı ve 3 sol birleştirme ile sonuçlanmadı.
heringer

8

Bütünlük aşkına:

Ayrıca, aşağıdaki gibi Include koleksiyon özellikleri olmamaları durumunda , yuvalanmış özellikleri doğrudan aracılığıyla dahil etmek de mümkündür :

_dbSet
    .Include(tier => tier.Contact.Titre)
    .Include(tier => tier.Contact.TypeContact)
    .Include(tier => tier.Contact.Langue);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.