दूसरे स्तर पर कई संदर्भ शामिल करें


87

मान लें कि हमारे पास यह मॉडल है:

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 तालिका से सभी डेटा को पुनः प्राप्त करना चाहूंगा, संपर्क तालिका से डेटा के साथ, Titre तालिका से, TypeContact तालिका से और इतने पर ... एक एकल निर्देश के साथ। मुझे शामिल करें / फिर InInlude API के साथ कुछ इस तरह लिख सकते हैं:

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

लेकिन टिट्रे प्रॉपर्टी के बाद, मैं TypeContact, Langue, Fonction ... जैसे अन्य संदर्भों को शामिल नहीं कर सकता ... विधि शामिल करें एक Tiers ऑब्जेक्ट्स का सुझाव देता है, और फिर InInlude एक Titre ऑब्जेक्ट का सुझाव देता है, लेकिन संपर्क ऑब्जेक्ट नहीं। मैं अपनी संपर्क सूची से सभी संदर्भ कैसे शामिल कर सकता हूं? क्या हम एक एकल निर्देश के साथ इसे प्राप्त कर सकते हैं?

जवाबों:


153

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

3
BTW, इस सवाल ने मुझे # 2124
ब्रीसेलम

क्यों नहीं: var contacts = _dbSet.Include(tiers => tiers.Contacts); contacts.ThenInclude(contact => contact.Titre); contacts.ThenInclude(contact => contact.TypeContact); contacts.ThenInclude(contact => contact.Langue); वह काम नहीं करेगा?
डग

1
@ डग नहीं, आप Queryableहर बार नई वस्तुओं का निर्माण करेंगे और उनका मूल्यांकन कभी नहीं करेंगे। contactsकेवल वही मूल मूल्य होगा जो आपने उसे सौंपा था।
ब्रिकेलम

क्या हुआ अगर tiers.Contactsएक है List<T>? आप आइटम को कैसे निर्दिष्ट करेंगे?
शाश्वत

2
यह समाधान काम करता है लेकिन परिणामी SQL स्टेटमेंट परिणाम के साथ तीन LEFT JOINs (कम से कम मेरे अनुभव में) होता है। यह बहुत अक्षम है। कोई बेहतर तरीका ज़रूर होगा।
EL MOJO

7

पूर्णता के लिए:

यह संभव है कि Include मामले के माध्यम से सीधे नेस्टेड संपत्तियों को शामिल करना संभव हो, जैसे कि वे संग्रह गुण नहीं हैं :

_dbSet
    .Include(tier => tier.Contact.Titre)
    .Include(tier => tier.Contact.TypeContact)
    .Include(tier => tier.Contact.Langue);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.