2016-02-12 5 views
5

मैं एक बहुत ही अजीब समस्या हो रही है विफल रहता है। यहां मेरे कोड, मानक बॉयलरप्लेट LINQ क्वेरी है, मैं ToList() अच्छा उपायLinq ToList() तत्काल निष्पादन को गति प्रदान करने

var assets = new List<Asset>(); 

using (var ctx = new LeaseContext()) 
{ 
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList(); 

    assets.ToList(); 
} 

return assets; 

के लिए दो बार परिवर्तित अभी तक संपत्ति अभी भी

.... System.Data.Entities.DynamicProxies की एक सूची मैंने पहले इस समस्या थी कभी नहीं किया है कर रहे हैं।

+0

आप एक ही चर के लिए ToList() का उपयोग क्यों करते हैं? –

+0

दूसरा 'ToList()' कुछ भी नहीं करता है क्योंकि आप 'ToList() 'के परिणाम का उपयोग नहीं कर रहे हैं। –

+0

मुझे पता है कि दूसरा ToList() अनावश्यक है, मैं बस परीक्षण करना चाहता था। – franklores

उत्तर

8

कारण आलसी लोडिंग है। जब आलसी लोडिंग ईएफ (डिफ़ॉल्ट रूप से) में सक्षम होती है, तो (फिर से, डिफ़ॉल्ट रूप से) ईएफ प्रत्येक इकाई के लिए गतिशील प्रॉक्सी बनाता है। संबंधित इकाइयों को लोड करने के लिए यह आवश्यक है। गतिशील प्रॉक्सी इकाई वर्ग से विरासत में प्राप्त किया जाएगा। तो आपके मामले में इसे Asset से विरासत में प्राप्त किया जाएगा। लेकिन गतिशील प्रॉक्सी के संदर्भ में संदर्भ होगा जिसने इसका उदाहरण बनाया है। और यह गतिशील प्रॉक्सी में संग्रहीत संदर्भ के माध्यम से इकाइयों को क्वेरी करने के लिए नेविगेशन गुण (जो वर्चुअल हैं) को ओवरराइड करेगा।

और मूल प्रकार की सूची में व्युत्पन्न प्रकारों के उदाहरण जोड़ने के लिए यह पूरी तरह कानूनी है।

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand 
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation 

तकनीकी तौर पर आप सिर्फ बारी बंद प्रॉक्सी पीढ़ी और आलसी लोड हो रहा है काम नहीं करेगा कर सकते हैं:

आप गतिशील प्रॉक्सी नहीं करना चाहते हैं, तो बस आलसी लोड हो रहा है और प्रॉक्सी सृजन को अक्षम करें। लेकिन मैं स्पष्ट रूप से दोनों सेटिंग्स को बंद करना पसंद करता हूं।

+0

मैंने कथन जोड़ा है, लेकिन अभी भी काम नहीं करता है। का उपयोग कर (वर ctx = नए LeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = झूठी; \t \t \t \t संपत्ति = ctx.Assets.OrderBy (o => o.Reference)। जहां (w => w.Status == AssetStatus.Active)। चयन करें (x => x) .सूची(); \t \t \t} \t \t \t \t \t \t वापसी संपत्ति; – franklores

+0

@ फ्रैंकलोरेस आपको संपत्तियों को क्वेरी करने के लिए 'cxt' का उपयोग करने से पहले आपको यह कथन जोड़ना चाहिए –

+0

@ फ्रैंकलोर्स क्षमा करें, मैं लगभग दूसरी कॉन्फ़िगरेशन सेटिंग भूल गया - प्रॉक्सी सृजन को अक्षम करने के लिए अलग है –

संबंधित मुद्दे