एंटिटी फ्रेमवर्क: विशिष्ट क्वेरी के लिए आलसी लोडिंग को अक्षम कैसे करें?


88

क्या एंटिटी फ्रेमवर्क 6 पर विशिष्ट क्वेरी के लिए आलसी लोडिंग को अक्षम करने का कोई तरीका है? मैं इसे नियमित रूप से उपयोग करना चाहता हूं, लेकिन कभी-कभी मैं इसे अक्षम करना चाहता हूं। मैं उन्हें लोड करने के लिए आभासी गुणों का उपयोग कर रहा हूं।


20
संदर्भ सेट करें। Configuration.LazyLoadingEnabled = false; उस क्वेरी से पहले जिसे आप चलाना चाहते हैं
कार्तिक गणेशन

5
आप बस मान सेट कर सकते हैं this.Configuration.LazyLoadingEnabled = false;, फिर इसे फिर से सेट करें this.Configuration.LazyLoadingEnabled = true;? इसके अलावा, आप इस msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
साभार @KarthikGanesan यह उम्मीद के मुताबिक काम किया।
मार्को अल्वेस

@KarthikGanesan क्या आप एक उत्तर के रूप में अपनी टिप्पणी रख सकते हैं? यह वास्तव में अच्छी तरह से काम कर रहा है :)
सम्पत

1
उत्तर @ टिप्पणी के रूप में टिप्पणी को जोड़ा गया
कार्तिक गणेशन

जवाबों:


76

आप जिस क्वेरी को निष्पादित करना चाहते हैं, उससे पहले निम्न कोड सेट करें

context.Configuration.LazyLoadingEnabled = false;

40

आप निम्न प्रकार से विशिष्ट क्वेरी के लिए आलसी लोडिंग को अक्षम कर सकते हैं:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

मुझे यहां कुछ याद आ रहा है, लेकिन हर बार कॉन्फ़िगरेशन बदलने के बजाय, .Include()केवल उन प्रश्नों पर उपयोग करने के लिए एक और दृष्टिकोण हो सकता है, जहां आप उत्सुकता से लोड करना चाहते हैं?

मान लीजिए कि हमारे पास एक Productवर्ग है जो एक वर्ग के लिए एक नेविगेशन संपत्ति है Colour, तो आप इस तरह के Colourलिए लोड कर सकते हैं Product-

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
मेरे लिए यह यहाँ सबसे अच्छा जवाब है!
इयान

यह कम हो जाता है यदि आप केवल "उत्पादों" को लोड करना चाहते हैं, बिना किसी को शामिल किए।
मैकान

तो आप उनकी किसी भी संबंधित वस्तु के बिना 'उत्पाद' प्राप्त करना चाहेंगे, या 'उनकी सभी संबंधित वस्तुओं के साथ उत्पाद?'
पैरीबर्ड

1
बहुत अधिक उपयोगी जवाब। यह उस विशिष्ट उप-समन्वित तालिकाओं को नियंत्रित करता है जो उस बिंदु पर लोड की जाती हैं जहां क्वेरी का निर्माण किया जा रहा है। किसी भी वास्तविक दुनिया की समस्या के लिए यह रास्ता तय करना होगा।
रिचर्ड पेंथरम

5
यह एक अलग तरीके से उपयोगी है ... यदि आप इसे इस तरह से करते हैं तो भी 'उत्पाद' से दूसरे संग्रह के लिए आलसी लोड हो सकता है। वास्तव में आलसी लोडिंग को अक्षम करना यह गारंटी देने के लिए अधिक प्रभावी है कि आवश्यक सभी डेटा पहले से प्राप्त किए जाते हैं और छिपे हुए प्रदर्शन की अड़चनें पैदा करने से बचते हैं।
डग

15

अपने आरेख गुणों पर जाएं और आलसी लोडिंग के लिए निर्दिष्ट संपत्ति ढूंढें और इसे अक्षम करें।

यदि आप पहले कोड का उपयोग कर रहे हैं तो अपने कॉन्फ़िगरेशन क्षेत्र में जाएं और इसे वहां से अक्षम करें:

this.Configuration.LazyLoadingEnabled = false;

6
बहुत सारे लोग इस सवाल पर जा रहे हैं और मैं कहना चाहता हूं, लोग इस योजना के बारे में लिखने के साथ-साथ कई बातें लिखते हैं। हमेशा पता रखें कि आपका कोड डेटाबेस को क्या भेजता है या आपको प्रदर्शन समस्याएं होंगी। वास्तविक क्वेरी देखने और जाँचने के लिए आप linq pad या अन्य टूल्स का उपयोग कर सकते हैं।
जुआन


3

एक और EF संस्करण के लिए एक और लगभग (एंटिटी फ्रेमवर्क 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

जब contextएक है ObjectContext, कम या ज्यादा अपने आवरण के पूर्ववर्ती चित्रित DbContext,।
गर्ट अर्नोल्ड

2

मान लीजिए कि आपके पास यह है:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

स्पष्ट सेटिंग के बावजूद आपको आलसी लोडिंग मिलेगी। तय करना आसान है, इसे इसे बदलें:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.