2011-03-15 15 views
13

प्रश्नों को पढ़ना here और here ने मुझे स्थिति में कुछ अंतर्दृष्टि दी है, और ऐसा लगता है कि AsEnumerable स्मृति स्मृति का उपयोग करना है। क्या इस LINQ को करने का एक बेहतर तरीका है और जिस तरह से यह किया गया है, क्या वह डेटा विश्वसनीय है?LINQ इकाई पर AsEnumerable() का प्रभाव क्या है?

असीमित परिणामों को हटाने में "स्थानीय अनुक्रम का उपयोग LINQ में क्वेरी ऑपरेटर को छोड़कर क्वेरी ऑपरेटर के SQL कार्यान्वयन में नहीं किया जा सकता है।"

var results = from p in pollcards.AsEnumerable() 
          join s in spoils.AsEnumerable() on new { Ocr = p.OCR, fileName = p.PrintFilename } equals new { Ocr = s.seq, fileName = s.inputFileName } 
          where p.Version == null 
          orderby s.fileOrdering, s.seq 
          select new ReportSpoilsEntity 
          { 
           seq = s.seq, 
           fileOrdering = s.fileOrdering, 
           inputFileName = s.inputFileName, 
           Ocr = p.OCR, 
           ElectorName = p.ElectorName 
          }; 

उत्तर

24

AsEnumerable()प्रभावी रूप सेIEnumerable<T> करने के लिए एक कलाकार जिसकी सदस्य संकल्प Enumerable बजाय Queryable के सदस्यों को खोजने के बनाता है। आमतौर पर इसका उपयोग तब किया जाता है जब आप SQL (या समान) के रूप में चलाने के लिए क्वेरी के हिस्से को मजबूर करना चाहते हैं, और बाकी को LINQ से ऑब्जेक्ट्स का उपयोग करने के लिए चलाया जाता है।

अधिक जानकारी के लिए मेरे Edulinq blog post on it देखें।

अब आपको वास्तव में दोAsEnumerable पर कॉल किया गया है। मैं देख सकता हूं कि पहले को कैसे हटाया जा सकता है, लेकिन दूसरा समस्या नहीं पैदा कर सकता है, लेकिन क्या आपने दोनों को हटाने का प्रयास किया है?

var results = from p in pollcards 
       join s in spoils 
       on new { Ocr = p.OCR, fileName = p.PrintFilename } 
       equals new { Ocr = s.seq, fileName = s.inputFileName } 
       where p.Version == null 
       orderby s.fileOrdering, s.seq 
       select new ReportSpoilsEntity 
       { 
        seq = s.seq, 
        fileOrdering = s.fileOrdering, 
        inputFileName = s.inputFileName, 
        Ocr = p.OCR, 
        ElectorName = p.ElectorName 
       }; 
+0

त्रुटि जो मैं metioned दोनों AsEnumerables को हटाते समय आया था। (मैंने केवल एक को हटाने की कोशिश नहीं की है)। क्या इससे कोई फर्क पड़ता है कि लूट और पोलकार्ड LINQ स्टेटमेंट स्वयं हैं? (एक IQueryable और एक संग्रह ) – Andy

+1

@ एंडी: हां, तथ्य यह है कि 'spoils' एक स्मृति संग्रह है, निश्चित रूप से प्रासंगिक है। मुझे लगता है कि एक और डीबी क्वेरी थी। मैं डेटाबेस के आधे से बाहर आधे से जुड़ने के तरीके के बारे में नहीं जानता। क्या 'spoils' * मूल रूप से * डेटाबेस से आया था? –

+0

लूट 2 क्विरी, आखिरी 10 के लिए शीर्ष 10 में से एक के लिए बनाया गया है, परिणाम पर एक संघ कर रहा है, और फिर उस संघ के माध्यम से प्रत्येक के लिए संग्रह को पॉप्युलेट कर रहा है। मुझे यकीन नहीं है कि हम यूनियन क्यों नहीं लौटते हैं और इसे एक संग्रह से संग्रह में परिवर्तित करते हैं। (IQuerryable को वापस करने के लिए AsEnumerables की आवश्यकता को हल कर देगा?) – Andy

5

LINQ-वस्तुओं के लिए Linq करने वाली एसक्यूएल के बजाय "के रूप में बाहर भाग" क्वेरी को तोड़ने और क्या करेंगे AsEnumerable का उपयोग करना। प्रभावी रूप से, आप अपनी टेबल दोनों के लिए "चयन * से ..." चला रहे हैं और फिर जॉइन कर रहे हैं, जहां क्लॉज फ़िल्टर, ऑर्डरिंग और प्रक्षेपण क्लाइंट-साइड।

1

एंटिटी फ्रेमवर्क के साथ असीमित उपयोग करते समय सावधान रहें। यदि आपकी तालिका में बहुत अधिक डेटा है, तो क्वेरी की वजह से आपकी क्वेरी धीमी हो रही है, पहले लोड डेटा और लागू करें जहां क्लॉज, ऑर्डरिंग और प्रक्षेपण।

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